我想要一种尽可能准确地测量C ++代码的方法。我确实看到boost有一个高分辨率的时钟,但是增强文档说它在性能方面是一个昂贵的时钟 - 有点击败目的:
http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html
还有其他方法吗?有没有办法测量CPU周期?
答案 0 :(得分:1)
在Windows上使用QueryPerformanceCounter()。
在Solaris上使用gethrtime()。
在其他UNIX上使用gettimeofday()。
当然你应该将它们包装在一个类中,这样你的代码才会使用该类 而不是直接的方法。
我们使用像
这样的类class dbbHighResTimer {
public:
dbbHighResTimer(); // Does call set()
dbbHighResTimer( int ); // Does not call set()
void set();
friend double operator - ( const dbbHighResTimer &, const dbbHighResTimer & );
friend int compare( const dbbHighResTimer &, const dbbHighResTimer & );
};
答案 1 :(得分:1)
如果这是用于在Windows上进行性能分析,请使用rdtsc指令,前提是它在CPU上是准确的(有关讨论,请参阅How to detect if RDTSC returns a constant rate counter value?)。它比QueryPerformanceCounter快得多。
答案 2 :(得分:1)
如果您想进行外部或内部分析,我无法从您的问题中判断出来。
对于外部分析,您在Windows上有Quantify(或其后继者),在gix和朋友的任何unix上都有gprof。如果您使用Solaris,您甚至可以使用dtrace,您可以将其附加到正在运行的应用程序以进行统计分析。
如果您正在寻找内部分析,那么Solaris / Linux上的gettimeofday
应该非常适合除紧密循环之外的所有内容。
答案 3 :(得分:1)
如果您正在使用GCC,请尝试使用GNU profiler(gprof)http://sourceware.org/binutils/docs/gprof/。 Gprof可能会为您提供最准确的结果。
在函数中使用开始/结束时间的差异对于由于上下文切换(黑白进程或线程)而言不太准确。