在C语言中,clock()返回一个负值的问题

4
我使用了一段非常简单的代码来测量执行时间。在不确定的情况下,它可以正常工作,但可能不超过20分钟。但是,在20分钟之后,它会返回负结果。我在论坛上搜索了很久,并尝试了一切方法,如更改数据类型、使用长无符号数(返回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

如有需要帮助,请提前感谢。


注意:clock() 返回类型为 clock_t - chux - Reinstate Monica
不要使用 clock()。在几乎所有实际应用中,它都存在缺陷,即使没有缺陷,也不会有任何有用的作用。 - R.. GitHub STOP HELPING ICE
3个回答

6

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

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


请注意,这是实现中的一个错误。C要求clock在结果不可表示时失败(返回(clock_t)-1);不允许包装。请参阅Austin Group问题686的解释。 - R.. GitHub STOP HELPING ICE

2
clock_t是一个长整型,是一个32位有符号值,它可以在溢出之前容纳2^31。在32位系统上,CLOCKS_PER_SEC的值等于1000000 [如POSIX所述],每隔约72分钟,clock()将返回几乎相同的值。
根据MSDN的说法,它也可以返回-1。
引用块中提到:“自进程启动以来经过的墙钟时间(秒数乘以CLOCKS_PER_SEC)。如果无法获得经过的时间量,则函数返回-1,强制转换为clock_t。”
顺便提一下: clock()测量程序使用的CPU时间,而不是实际时间,clock()的返回值以微秒为单位。

正在研究 clock_t 的定义。没有找到任何说明它是 long 的信息,只有说明其“范围和精度...是实现定义的”。(C11dr 7.21.1)你有一些有用的参考资料可以表明它是‘long’或者 32 位的吗? - chux - Reinstate Monica
1
@chux:我不确定它是否很长,但我发现通常会使用较长的类型。至于一个参考,你可以查看这个链接:在GNU系统中,clock_t等同于long int,而CLOCKS_PER_SEC是一个整数值。 http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html 如果我错了,请纠正我?:( - Rahul Tripathi
@chux:这是错的吗?还是我漏掉了什么。如果我有所遗漏,请评论一下。谢谢! :) - Rahul Tripathi
复制该参考:在GNU中,clock_t是一个“long int”。现在我想知道在GNU系统中,一个“long int”是32位还是至少32位。嗯。我猜是后者。 - chux - Reinstate Monica
1
整数类型指的是32位或64位。 - chux - Reinstate Monica
显示剩余3条评论

0
如果你使用的是 POSIX 系统,可以尝试使用 clock_gettime() 函数并设置 CLOCK_PROCESS_CPUTIME_ID 选项。clock_gettime() 函数使用 struct timespec 结构体返回时间信息,因此不会遇到与使用单个整数相同的问题。

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