我计算了三种不同类型的搜索,顺序,递归二进制和迭代二进制所需的时间。我有这些,它会迭代并完成搜索。我的问题是,当我为它们计时时,我每次都得到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
。
我在这里做错了吗?或者它在我的搜索对象中?
答案 0 :(得分:3)
clock()
不是一个准确的计时器,它只是不适合短时间间隔。
C表示,自实时定义的时代开始以来,clock 返回实现对程序使用的处理器时间的最佳近似值。
如果在两个连续的时钟调用之间,程序花费的时间少于时钟函数的一个整数,则可以得到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以找到更好的方法(如果准确性是最高优先级)。
答案 1 :(得分: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/