Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何通过多次调用获得程序的性能?_C_Linux_Unix - Fatal编程技术网

C 如何通过多次调用获得程序的性能?

C 如何通过多次调用获得程序的性能?,c,linux,unix,C,Linux,Unix,我正在检查一个程序的性能。我有以下计划: /* stdlibrary_writer.c ‐ write 400,000 characters with fprintf */ #include <stdio.h> #define OUTPUTNAME "fprint.out" main() { long i; FILE *fp; if ((fp=fopen(OUTPUTNAME,"w")) == NULL) { fprintf(stderr,"Can't open

我正在检查一个程序的性能。我有以下计划:

/* stdlibrary_writer.c ‐ write 400,000 characters with fprintf */
#include <stdio.h>
#define OUTPUTNAME "fprint.out"
main()
{
  long i;
  FILE *fp;
  if ((fp=fopen(OUTPUTNAME,"w")) == NULL) {
    fprintf(stderr,"Can't open %s. Bye.\n",OUTPUTNAME);
    exit(1);
  }
  for (i=0; i<400000; i++) { /* write 400,000 Xs with fprintf */
    if (fprintf(fp,"X") < 1) {
      fprintf(stderr,"Can't write. Bye\n");
      exit(1);
    }
  }
  fclose(fp);
  exit(0);
}
/*stdlibrary\u writer.c-使用fprintf编写400000个字符*/
#包括
#定义OUTPUTNAME“fprint.out”
main()
{
龙我;
文件*fp;
if((fp=fopen(OUTPUTNAME,“w”))==NULL){
fprintf(stderr,“无法打开%s。再见。\n”,OUTPUTNAME);
出口(1);
}

对于(i=0;i您可以编译程序,然后在执行时使用时间来了解其性能,如下所示

$ gcc stdlibrary_writer.c -o stdlibrary_writer.o

$ time ./stdlibrary_writer.o
对于连续10次的性能检查,您需要将其运行到这样的循环中

c=1
while [ $c -le 10 ]
do
    time ./stdlibrary_writer.o
    (( c++ ))
done

如果您正在查看从Unix shell执行程序所消耗的时间,请使用Linux时间,如下所示:

time ./a.out 

real    0m0.001s
user    0m0.000s
sys     0m0.000s
#include <sys/time.h>
struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);
/* Program code to execute here */
gettimeofday(&tv2, NULL);
printf("Time taken in execution = %f seconds\n",
   (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
   (double) (tv2.tv_sec - tv1.tv_sec));
第二,如果您想要在程序代码(C)中执行大量语句所花费的时间,请尝试使用以下方法:

time ./a.out 

real    0m0.001s
user    0m0.000s
sys     0m0.000s
#include <sys/time.h>
struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);
/* Program code to execute here */
gettimeofday(&tv2, NULL);
printf("Time taken in execution = %f seconds\n",
   (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
   (double) (tv2.tv_sec - tv1.tv_sec));
#包括
结构时间值tv1,tv2;
gettimeofday(&tv1,NULL);
/*在此执行的程序代码*/
gettimeofday(&tv2,NULL);
printf(“执行时间=%f秒\n”,
(双倍)(tv2.tv_usec-tv1.tv_usec)/1000000+
(双张)(tv2.tv_sec-tv1.tv_sec);;

当然,您需要编译您的程序。要进行基准测试,请使用
-O2
,例如

 gcc -Wall -O2 -g stdlibrary_writer.c -o stdlibrary_writer
你可以像这样计时一个shell循环

 time for i in $(seq 1 10) ; do ./stdlibrary_writer ; done
但实际上,您可能需要测量10次,然后计算平均值(&min和max)

请注意,您可以通过将上述命令导入一些脚本(您应该自己编写)来自动计算平均值、最小值和最大值

顺便说一句,在GNU中使用
perror
,或
strerror(errno)
,或
%m
来处理错误,例如:

if ((fp=fopen(OUTPUTNAME,"w")) == NULL) {
 perror(OUTPUTNAME);
exit(EXIT_FAILURE);
}


你需要在linux上阅读使用
$time fprint.out
所以……用
时间运行它。这里有什么问题吗?仅供参考,
main()
的建议签名是
int main()
以显式.form.@SouravGhosh我的问题是如何在10次连续调用中计时?@LindaSu我从未尝试过回答你的问题,这是一个改进代码的建议。:-)不要使用
gettimeofday()
,除此之外,它不是单调的。使用
clock\u gettime()
@DietrichEpp我的问题是如何在10次连续调用中计时?我的问题是如何在10次连续调用中计时?你必须重复我给出的相同方法,在你的可执行文件中使用10次连续时间。对不起,我不明白。如何与你一起使用10次连续时间r可执行文件。对不起,我是linux新手。请详细说明您的解释好吗?每次运行可执行文件,如
stdlibrary\u writer.o
添加
time
,您都会发现每次的性能,并且连续10次需要在shell脚本中使用循环并运行
time./stdlibrary\u writer.o命令。给可执行文件命名错误
stdlibrary\u writer.o
if ((fp=fopen(OUTPUTNAME,"w")) == NULL) {
  fprintf(stderr,"Can't open %s. (%m), Bye.\n",
          OUTPUTNAME);
  exit(EXIT_FAILURE);
}