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

Posted

技术标签:

【中文标题】C - 使用 <time.h> 以毫秒为单位的程序执行时间【英文标题】:C - execution time of program in millseconds using <time.h> 【发布时间】:2016-09-18 15:34:10 【问题描述】:

我正在尝试使用时间标头获取程序的执行时间,但找不到任何仅使用 &lt;time.h&gt; 而不是 &lt;sys/time.h&gt; 的资源。

我试过了

 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.. 我猜是因为时间是一个整数,而我的过程不到一秒。

如何以毫秒为单位显示执行情况?

谢谢

【问题讨论】:

【参考方案1】:

虽然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 得到毫秒,我很好。 虽然 clock 的 MSVC 实现确实提供了 wall time 作为 stated here @deamentiaemundi 这适用于在线编译器,但是一旦我带入教授将在其中编译它的服务器......它每次返回 0.000 毫秒。奇怪 @Walker 确实很奇怪。您是否使用了我发布的确切代码?您是否尝试在j 的上限上添加零或二?由于rand,内循环无法优化,至少不应该,所以……嗯…… @deamentiaemundi 我认为开始和停止之间的代码只是需要时间的任务。因为它被我的任务取代了。听起来他们不是?谢谢你的帮助【参考方案2】:

测量时间的正确方法是使用clock_gettime(CLOCK_MONOTONIC, &amp;ts_current);

另外,gettimeofday() should be avoided。

使用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() 便携。【参考方案3】:

time 函数只有 1 秒的分辨率。请改用gettimeofday,它具有微秒级分辨率。

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

【讨论】:

能否提供样品?非常感谢你 gettimeofday 不应用于测量时差。请改用clock_gettime(CLOCK_MONOTONIC, &amp;ts_current);,如果您想了解更多,请check this out gettimeofday 是特定于 unix 的,使用 clock() 获得快速而肮脏的便携式解决方案。

以上是关于C - 使用 <time.h> 以毫秒为单位的程序执行时间的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现linux系统获取高精度时间差(毫秒)

请问在C语言里怎么获取当前时间和日期(精确到毫秒)?

c/c++如何获取任意时间的时间戳

C++秒级时间戳,毫秒级时间戳

C:产生随机数

linux —— C编程