测量C ++代码的最准确但“最便宜”的方法是什么?

时间:2012-12-06 14:29:07

标签: c++ boost cpu

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

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

还有其他方法吗?有没有办法测量CPU周期?

4 个答案:

答案 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可能会为您提供最准确的结果。

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