我想要一种尽可能准确地测量 C++ 代码的方法。我确实看到 boost 有一个高分辨率时钟,但是 boost 文档说它在性能方面是一个昂贵的时钟——有点违背了目的:
http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html
还有哪些其他方法?有什么方法可以测量 CPU 周期吗?
我想要一种尽可能准确地测量 C++ 代码的方法。我确实看到 boost 有一个高分辨率时钟,但是 boost 文档说它在性能方面是一个昂贵的时钟——有点违背了目的:
http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html
还有哪些其他方法?有什么方法可以测量 CPU 周期吗?
如果您使用的是 GCC,请尝试 GNU profiler (gprof) http://sourceware.org/binutils/docs/gprof/。Gprof 可能会为您提供最准确的结果。
由于上下文切换(黑白进程或线程),在函数中获取开始/结束时间的差异不太准确。
在 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 & );
};
如果这是为了在 Windows 上进行分析,请使用 rdtsc 指令,前提是它在您的 CPU 上是准确的(请参阅如何检测 RDTSC 是否返回恒定速率计数器值?进行讨论)。它比 QueryPerformanceCounter 快很多。
如果您想要外部或内部分析,我无法从您的问题中看出。
对于外部分析,您可以在 Windows 上使用 Quantify(或其继任者),在任何带有 g++ 和朋友的 unix 上使用 gprof。如果您使用 Solaris,您甚至还有 dtrace,您可以将其附加到正在运行的应用程序以进行统计分析。
如果您正在寻找内部分析,那么gettimeofday
在 Solaris/Linux 上,除了在紧密循环中之外,其他任何东西都应该具有足够的性能。