我想知道在Linux上用C ++编写的函数的执行时间。 我发现很多关于这个的post。 我尝试了这个链接计时器方法中提到的所有方法来计算时间。 以下是我的函数执行时间的结果:
time() : 0 seconds clock() : 0.01 seconds gettimeofday() : 0.002869 seconds rdtsc() : 0.00262336 seconds clock_gettime() : 0.00672151 seconds chrono : 0.002841 seconds
请帮助我哪个方法是可靠的,因为所有的结果在他们的读数不同。 我读到你的操作系统正在不同的任务之间切换,所以读数不能期望是非常准确的。 有没有一种方法可以计算CPU花在我的函数上的时间。 我听说过使用分析工具,但还没有find任何只是一个function的例子。 请指导我
阅读时间(7) 。
由于各种原因(并取决于您的实际硬件 ,即您的主板)时间不是你想要的那么准确。
所以,添加一些循环重复你的函数多次,或改变它的输入,使其运行时间更长。 确保整个程序的执行时间(由时间(1) …给出)至少为大约一秒(如果可能,请确保至少有半秒CPU时间)。
为了分析,编译并链接到g++ -Wall -pg -O1
然后使用gprof(1) (有更复杂的方法来配置文件,例如oprofile …)。
另请参阅这个答案,以一个非常类似的问题 (由同一个Zara )。
如果你正在做简单的测试,试图找出哪个更好,那么任何方法都可以。 例如:
const int MAX = 10000; // times to execute the function void benchmark0() { auto begin = std::chrono::steady_clock::now(); for (int i = 0; i < MAX; ++i) method0(); auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin); std::cout << "Cost of method0() is " << elapsed .count() << " milliseconds" << std::endl; } void benchmark1() { /* almost the same as benchmark0, but calls method1 */ } int main() { benchmark0(); benchmark0(); benchmark1(); benchmark1(); }
你可能已经注意到了benchmark0
和benchmark1
被连续调用了两次:因为会有CPU,I / O的缓存,你可能想要摆脱由于缓存而导致的性能增益/丢失,但是测量纯粹的执行时间。
当然,你也可以使用g ++来分析程序。