我正在使用一个非常简单的代码来衡量执行时间。它运作良好,直到我不确定可能不超过20分钟。但是(> 20分钟后)它返回负面结果。我搜索在整个论坛中尝试了一切,比如更改数据类型,使用long unsigned(返回0)但又失败了。 以下是我的代码片段
main()
{
time_t start,stop;
double time_arm;
start = clock();
/* ....... */
stop = clock();
time_arm=(double)(stop-start)/(double)CLOCKS_PER_SEC;
printf("Time Taken by ARM only is %lf \n",time_arm);
}
输出是 仅ARM采用的时间为 -2055.367296
提前感谢任何帮助。
答案 0 :(得分:6)
POSIX要求CLOCKS_PER_SEC
为1,000,000。这意味着你的计数是微秒 - 而2 31 微秒约为35分钟。你的计时器只是溢出,所以当发生这种情况时你无法获得有意义的结果。
为什么你在20分钟看到问题,我不确定 - 也许你的CLOCKS_PER_SEC
不兼容POSIX。无论如何,你的问题是计时器溢出。您需要以不同的方式处理此问题 - 也许请查看getrusage(2)
。
答案 1 :(得分:2)
clock_t
很长,这是一个32位有符号值 - 它可以在溢出之前保持2 ^ 31。在32位系统上,CLOCKS_PER_SEC
值等于1000000
[如POSIX所述] clock()几乎每72分钟后返回相同的值。
根据MSDN,它也可以返回-1。
自处理开始以来经过的挂钟时间(已过去 以秒为单位的时间CLOCKS_PER_SEC)。 如果经过的时间量 如果不可用,则函数返回-1 ,强制转换为clock_t。
旁注: -
clock()
测量程序使用的CPU时间,它不测量实时,clock()
返回值以微秒为单位。
答案 2 :(得分:0)
如果您使用的是POSIX系统,则可以尝试将clock_gettime()
与CLOCK_PROCESS_CPUTIME_ID
选项一起使用。 clock_gettime()
使用struct timespec
来返回时间信息,因此不会遇到与使用单个整数相同的问题。