2

我想要一种尽可能准确地测量 C++ 代码的方法。我确实看到 boost 有一个高分辨率时钟,但是 boost 文档说它在性能方面是一个昂贵的时钟——有点违背了目的:

http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html

还有哪些其他方法?有什么方法可以测量 CPU 周期吗?

4

4 回答 4

2

如果您使用的是 GCC,请尝试 GNU profiler (gprof) http://sourceware.org/binutils/docs/gprof/。Gprof 可能会为您提供最准确的结果。

由于上下文切换(黑白进程或线程),在函数中获取开始/结束时间的差异不太准确。

于 2012-12-06T15:09:48.577 回答
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 & );
};
于 2012-12-06T14:37:00.233 回答
1

如果这是为了在 Windows 上进行分析,请使用 rdtsc 指令,前提是它在您的 CPU 上是准确的(请参阅如何检测 RDTSC 是否返回恒定速率计数器值?进行讨论)。它比 QueryPerformanceCounter 快很多。

于 2012-12-06T14:53:10.693 回答
1

如果您想要外部或内部分析,我无法从您的问题中看出。

对于外部分析,您可以在 Windows 上使用 Quantify(或其继任者),在任何带有 g++ 和朋友的 unix 上使用 gprof。如果您使用 Solaris,您甚至还有 dtrace,您可以将其附加到正在运行的应用程序以进行统计分析。

如果您正在寻找内部分析,那么gettimeofday在 Solaris/Linux 上,除了在紧密循环中之外,其他任何东西都应该具有足够的性能。

于 2012-12-06T14:54:23.670 回答