【问题标题】:Most accurate, but "cheapest" way to measure C++ code?测量 C++ 代码的最准确但“最便宜”的方法?
【发布时间】:2012-12-06 14:29:06
【问题描述】:

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

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

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

【问题讨论】:

  • Boost.Stopwatches 正在等待审核以纳入 Boost。这可能会成为最好的选择。
  • 您要测量什么?代码执行时间?目的是什么?
  • 分析器是否适合您的需求?
  • “经典”解决方案是检查对 clock 函数的调用之间的区别。
  • 您要测量经过的(实际)时间还是 CPU 使用时间?请注意,当您在同一台机器上运行其他任务时,经过的时间并不准确,而在这种情况下 CPU 使用时间应该更准确(至少在理论上)。

标签: c++ boost cpu


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我无法从您的问题中判断您是需要外部分析还是内部分析。

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

    如果您正在寻找内部分析,则 Solaris/Linux 上的 gettimeofday 对于除了紧密循环之外的任何事情都应该足够高效。

    【讨论】:

      【解决方案3】:

      在 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 & );
      };
      

      【讨论】:

        【解决方案4】:

        如果这是在 Windows 上进行分析,请使用 rdtsc 指令,前提是它在您的 CPU 上是准确的(请参阅 How to detect if RDTSC returns a constant rate counter value? 进行讨论)。它比 QueryPerformanceCounter 快很多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 2020-12-21
          • 2017-03-09
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          相关资源
          最近更新 更多