【问题标题】:error in calculation execution time of c program?c程序计算执行时间出错?
【发布时间】:2014-08-28 08:10:19
【问题描述】:

谁能告诉我如果我在下面的行中错过了双倍会发生什么?

time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

我试图计算我的排序问题的运行时间,但忘记了类型转换为加倍。代码运行了将近 90 分钟,但打印的输出时间为“270.000006”。谁能帮我弄清楚这 270 意味着什么?

它有时也会显示“-ve”值。这个问题的任何解决方案。

编辑 - 我正在对 10^9 和 10^10 数字进行排序,因此代码将运行数小时。

【问题讨论】:

  • 如何获得 end 和 begin 值以及它们是什么类型?
  • 我使用了与 Debasish 下面提到的相同的代码。

标签: c time.h


【解决方案1】:

如果代码运行了将近 90 分钟,您将在 72 分钟内获得 32 位架构上的 clock_t 类型溢出。我相信这就是你的情况。

【讨论】:

  • 有没有办法避免这种溢出?
  • @Anurag 在你已经完成的运行中,我想你可以尝试弄清楚它溢出了多少(猜它溢出“一次”),然后假设它是你的值 + 最大值.对于将来的修复,您当然必须将其保存到可以适合结果的变量中。
  • @Anurag,这取决于您期望的结果有多精确。由于您的进程运行了几个小时,我的建议是分别为 Windows 和 Unix 使用 GetLocalTime 和 gettimeofday+localtime 函数。
  • @HighPredator。谢谢你的建议。我尝试在 Linux 中使用 gettimeofday+localtime,它最初运行良好,但是对于运行大约 6 小时的代码,它给出了一些错误。有任何想法吗??由于我仍然不确定这是否是错误的原因,所以我再次运行它。还有其他可行的选择吗??
  • @Anurag,你遇到了什么错误,你是怎么使用指定函数的?
【解决方案2】:

正确用法是:

    clock_t begin, end;
    double time_spent;

    begin = clock();
    /* actual task that needs to be monitored */
    end = clock();
    time_spent = (double)(end - begin) / CLOCKS_PER_SEC; // in seconds

您在这里测量的是 CPU 时间,而不是包括 I/O 时间在内的经过时间。 CLOCKS_PER_SEC 是一个常量,在 .计算需要在浮点运算中完成。 另一种计算时间的方法是使用 time 命令。

阅读How to log the time taken for a unix command?

【讨论】:

  • 他知道,这不是他想要的。他问如果他将其保存/类型转换为双精度会发生什么。
  • 如果你不类型转换为双精度,那么你会因为整数运算而失去精度
  • 是的,或者更糟的是,溢出,这更像是对他问题的回答。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多