【问题标题】:clock() returning a negative value in C时钟()在C中返回一个负值
【发布时间】:2013-10-22 09:56:57
【问题描述】:

我正在使用一个非常简单的代码来测量执行时间。它运行良好,直到我不确定可能不超过 20 分钟。但之后(> 20 分钟。)它返回负面结果。我搜索了整个论坛并尝试了所有方法,例如更改数据类型,使用 long unsigned (返回 0)但再次失败。 以下是我的代码的sn-p

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
  • 不要使用clock()。它几乎在每个现实世界的实现中都有错误,即使没有错误也不会做任何有用的事情。

标签: c clock time.h time-t


【解决方案1】:

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

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

【讨论】:

  • 请注意,这是实现中的一个错误。如果结果不可表示,C 要求 clock 失败(返回 (clock_t)-1);不允许包装。请参阅Austin Group issue 686 的解释。
【解决方案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() 返回值以微秒为单位指定。

【讨论】:

  • 正在研究clock_t 的定义。没有发现它是long,只有它的“范围和精度......是实现定义的”。 (C11dr 7.21.1)你有一些有用的参考来表明它是“长”还是 32 位?
  • @chux:- 我不会打赌它很长,但我发现通常使用 long。至于一个参考,您可以检查一下:- 在 GNU 系统中,clock_t 等效于 long int 而 CLOCKS_PER_SEC 是一个整数值。 cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html 如果我错了,请纠正我吗? :(
  • @chux:- 错了吗?或者我错过了什么。如果我错过了什么,请发表评论。谢谢! :)
  • 复制了该参考:在 GNU clock_t 中是 long int 现在我想知道在 GNU 系统中是 long int 32 位还是至少 32 位。嗯。我怀疑是后者。
  • Integer Types 说 32 位或 64 位。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2020-11-26
    • 2014-03-31
    • 2013-09-24
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多