1

我正在计时执行三种不同类型的搜索(顺序、递归二进制和迭代二进制)需要多长时间。我有这些,它确实会迭代并完成搜索。我的问题是,当我对它们全部计时时,我每次都得到 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;

对于最后两个,我得到10000

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

4

2 回答 2

3

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

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

如果在两个连续的时钟调用之间你的程序花费的时间少于时钟函数的一个单位,你可以得到 0。POSIXclockCLOCKS_PER_SECas定义单位1000000(单位是 1 微秒)。

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

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

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


综上所述,要精确clock_t到秒计算和打印时间几乎是不可能的。您可能希望在 Stackoverflow 上看到这一点,以找到更好的方法(如果准确性是重中之重)。

于 2013-02-17T02:33:54.660 回答
2

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

我认为两个选项要么使用clock_gettime甚至更好,您是否考虑过使用OProfileCodeAnalyst

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

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

于 2013-02-17T03:55:39.687 回答