使用<time.h>,以毫秒为单位计算程序的C执行时间

3

我试着使用time头文件来获取程序的执行时间,但是没有找到简单使用<time.h>而不是<sys/time.h>的资源。

我尝试过

 time_t startTime;                
 time_t endTime;                 
 long double execTime;           

 /* Start timer */
 time(&startTime);

 ..STUFF THAT TAKES TIME..

time(&endTime); 
execTime = difftime(endTime, startTime); 

printf("Computing took %Lf\n", execTime * 1000);

但是每次都打印出0..我猜是因为时间是一个整数,而我的进程少于一秒钟。如何显示以毫秒为单位的执行时间? 谢谢
3个回答

3

正确的计时方式是使用clock_gettime(CLOCK_MONOTONIC, &ts_current);

同时,应该避免使用gettimeofday()来测量时间。

以下是使用clock_gettime()进行时间差(秒和纳秒)测量的完整示例(可以转换为毫秒):

#include <stdio.h>
#include <time.h>

struct timespec diff(struct timespec start, struct timespec end)
{
    struct timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}

int main()
{
    struct timespec time1, time2;
    int temp = 0;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    printf("Time difference: %ld [s] %ld [ns]", (long) diff(time1,time2).tv_sec, (long) diff(time1,time2).tv_nsec);
    return 0;
}

请注意,clock_gettime()在Mac OS X上不可用,因此其可移植性不如gettimeofday() - Jonathan Leffler

3

虽然 clock_gettime 应该是首选的方法,但它是 Posix 而不是标准 C。他们只有 clock。它有很多缺点,但对于快速而肮脏的测量来说已经足够了。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main()
{
  int i, j, a[1000000] = { 0 };
  clock_t start, stop;
  srand(0xdeadbeef);
  start = clock();
  // play around with these values, especially with j
  for (j = 0; j < 100; j++) {
    for (i = 0; i < 1000000; i++) {
      a[i] = rand() % 123;
      a[i] += 123;
    }
  }
  stop = clock();
  printf("Time %.10f seconds\n", (double) (stop - start) / CLOCKS_PER_SEC);
  exit(EXIT_SUCCESS);
}

完美。我将输出乘以1000以得到毫秒,现在没问题了。 - Walker
@deamentiaemundi,在线编译器上可以运行,但是当我将其带到教授将在其中编译它的服务器上时,它每次都返回0.000毫秒。很奇怪。 - Walker
@Walker 确实很奇怪。你使用的是我发布的完全相同的代码吗?你试图将j的上限加一或两个零吗?由于rand,内部循环不能被优化,至少不应该被优化,所以......嗯嗯...... - deamentiaemundi
@deamentiaemundi 我原以为开始和结束之间的代码只是需要时间的任务。也就是说,它会被我的任务所替代。但听起来好像并不是这样?感谢你的帮助。 - Walker
@Walker 不好意思,我以为你已经尝试过我的方法了。 clock 简单易用,但其中一个缺点是分辨率仅限于中等级别。毫秒还可以接受,但更小的时间单位需要其他方法,例如:clock_gettime。或者使用内部CPU计数器(例如:rtdsc计数器),但在多处理器架构时不太容易实现。 - deamentiaemundi
显示剩余2条评论

1

time函数只有1秒的分辨率。相反,使用具有微秒分辨率的gettimeofday

struct timeval tstart, tend;
gettimeofday(&tstart, NULL);
// do something that takes time
gettimeofday(&tend,NULL);

1
请问您能否提供一个样例?非常感谢。 - Walker
不应使用gettimeofday来测量时间差。如果想要了解更多,请使用clock_gettime(CLOCK_MONOTONIC, &ts_current);代替,可以查看这里 - Prateek Gupta
gettimeofday 是 Unix 特有的,使用 clock() 可以得到一个快速而简单的可移植解决方案。 - chqrlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接