C - 使用 <time.h> 以毫秒为单位的程序执行时间
Posted
技术标签:
【中文标题】C - 使用 <time.h> 以毫秒为单位的程序执行时间【英文标题】:C - execution time of program in millseconds using <time.h> 【发布时间】:2016-09-18 15:34:10 【问题描述】:我正在尝试使用时间标头获取程序的执行时间,但找不到任何仅使用 <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.. 我猜是因为时间是一个整数,而我的过程不到一秒。
如何以毫秒为单位显示执行情况?
谢谢
【问题讨论】:
【参考方案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, &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, &ts_current);
,如果您想了解更多,请check this out
gettimeofday
是特定于 unix 的,使用 clock()
获得快速而肮脏的便携式解决方案。以上是关于C - 使用 <time.h> 以毫秒为单位的程序执行时间的主要内容,如果未能解决你的问题,请参考以下文章