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

时间:2015-01-29 05:33:42

标签: 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 %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);
}

我想在10次连续调用中计算这个程序。我怎样才能做到这一点? 我想使用Unix的/usr/bin/time命令为程序计时。

3 个答案:

答案 0 :(得分:2)

当然你需要编译你的程序。对于基准测试,请使用-O2请求编译器optimization,例如

 gcc -Wall -O2 -g stdlibrary_writer.c -o stdlibrary_writer

你可以像

那样计算一个shell循环
 time for i in $(seq 1 10) ; do ./stdlibrary_writer ; done

但实际上你应该测量10次然后计算平均值(&amp; min和max),例如

for i in $(seq 1 10) ; do echo round $i;  time  ./stdlibrary_writer ; done

请注意,您可以通过将上述命令汇总到某些awk(1)脚本(您应该自己编写)来自动计算average,min和max。

BTW,在GNU printf(3)中使用perrorstrerror(errno)%m来处理错误,例如

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

if ((fp=fopen(OUTPUTNAME,"w")) == NULL) {
  fprintf(stderr,"Can't open %s. (%s), Bye.\n",
          OUTPUTNAME, strerror(errno));
  exit(EXIT_FAILURE);
}

if ((fp=fopen(OUTPUTNAME,"w")) == NULL) {
  fprintf(stderr,"Can't open %s. (%m), Bye.\n",
          OUTPUTNAME);
  exit(EXIT_FAILURE);
}

您需要阅读time(7)

答案 1 :(得分:1)

您可以编译程序,然后在执行程序时使用时间来了解它的性能如下,

$ 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

答案 2 :(得分:1)

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

time ./a.out 

real    0m0.001s
user    0m0.000s
sys     0m0.000s

其次,如果你想在程序代码(C)中执行多少个语句,请尝试使用gettimeofday(),如下所示,

#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));