【问题标题】:How to calculate and print clock_t time roughly如何粗略计算和打印clock_t时间
【发布时间】:2013-02-01 18:26:13
【问题描述】:

我正在计时执行三种不同类型的搜索(顺序、递归二进制和迭代二进制)需要多长时间。我有这些,它确实会迭代并完成搜索。我的问题是,当我对它们全部计时时,我每次都得到 0,即使我制作了一个 100,000 的数组,并且我让它搜索不在数组中的东西。如果我在搜索中设置一个断点,它显然会使时间变长,并且它给了我一个可以使用的合理时间。但否则它总是 0。这是我的代码,所有三个搜索计时器都是相似的。

 clock_t recStart = clock();
 mySearch.recursiveSearch(SEARCH_INT);
 clock_t recEnd = clock();
 clock_t recDiff = recEnd - recStart;
 double recClockTime = (double)recDiff/(double)CLOCKS_PER_SEC;
 cout << recClockTime << endl;

 cout << CLOCKS_PER_SEC << endl;

 cout << recClockTime << endl;

对于最后两个,我得到 1000 和 0。

我在这里做错了吗?还是在我的搜索对象中?

【问题讨论】:

  • 自从我找到了 boost 的 auto_cpu_timer,我就再也没有回头。它会为您处理所有这些事情。实例化计时器,让它超出范围,瞧。
  • 循环运行搜索(例如,一百万次)。然后,将您记录的时间除以迭代次数,得到单次搜索调用的时间。
  • 您通过添加 roughly 提出了观点,但我认为 roughly 应该是 0.2 秒,clock() 在这里似乎可以正常工作。
  • 是的,这就是我猜它需要的值,只有 0.2,但我得到了零,即使我确实将它设置为搜索 1,000,000 次迭代。这段代码看起来还好吗?我的问题出在其他地方吗?
  • @KKendall:将您的代码与:ideone.com/CXajTQ进行比较

标签: c++ clock ctime cpu-speed


【解决方案1】:

clock() 不是一个准确的计时器,它不能很好地用于计时短间隔。

C 表示时钟返回实现对程序使用的处理器时间的最佳近似值,因为该实现定义的时代开始时仅与程序调用相关。

如果您的程序在两个连续的时钟调用之间花费的时间少于时钟函数的一个单位,您可能会得到 0。POSIX clock 将 CLOCKS_PER_SEC 的单位定义为 1000000(单位为 1 微秒)。

(http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html)

要测量 x86/x64 中的时钟周期,您可以使用汇编来检索 CPU 时间戳计数器寄存器 rdtsc 的时钟计数。 (可以通过内联汇编来实现?)请注意,它返回的是时间戳,而不是经过的秒数。因此,您还需要检索 cpu 频率。

但是,以秒为单位获取准确时间的最佳方法取决于您的平台。


总而言之,以秒为单位准确计算和打印clock_t 时间几乎是不可能的。您可能希望在 Stackoverflow 上查看 this 以找到更好的方法(如果准确性是重中之重)。

【讨论】:

    【解决方案2】:

    clock() 只是没有足够的分辨率 - 这是关于该主题的一个很好的讨论/博客 http://www.guyrutenberg.com/2007/09/10/resolution-problems-in-clock/

    我认为两个选项要么使用clock_gettime,或者更好的是您是否考虑使用OProfile 或CodeAnalyst?

    我个人更喜欢使用工具——OProfile 很好。我之前没有使用过 CodeAnalyst - 然后是 Valgrind 和 gprof。

    如果您坚持使用clock_gettime - 请查看此 http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 2014-05-09
      • 2023-03-20
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多