4

我正在使用一个非常简单的代码来测量执行时间。它运行良好,直到我不确定可能不超过 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

任何帮助表示赞赏,在此先感谢。

4

3 回答 3

6

POSIX 要求CLOCKS_PER_SEC为 1,000,000。这意味着您的计数以微秒为单位 - 2 31微秒约为 35 分钟。您的计时器刚刚溢出,因此发生这种情况时您无法获得有意义的结果。

为什么你会在 20 分钟后看到问题,我不确定——也许你CLOCKS_PER_SEC的不是 POSIX 兼容的。无论如何,您的问题是计时器溢出。您需要以不同的方式处理此问题 - 也许查看getrusage(2).

于 2013-10-14T18:43:55.943 回答
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()返回值以微秒为单位指定。

于 2013-10-14T18:45:03.717 回答
0

如果您在 POSIX 系统上,您可以尝试使用clock_gettime()该选项。用于返回时间信息,因此不会遇到与使用单个整数相同的问题。CLOCK_PROCESS_CPUTIME_IDclock_gettime()struct timespec

于 2013-10-14T18:57:53.873 回答