2

假设我编写了一个程序,然后我对代码进行了一些“优化”。就我而言,我想测试std::moveC++11 中的新功能在多大程度上可以提高程序的性能。我想检查“优化”是否有意义。

目前我通过以下步骤对其进行测试:

  1. 编写程序(无std::move),编译,获取二进制文件m1
  2. 优化它(使用std::move),编译,得到二进制文件 m2
  3. 使用命令“time”比较耗时:

    time ./m1 ; time ./m2
    

编辑:

为了得到统计结果,需要运行数千次测试。

有没有更好的方法来做到这一点,或者是否有一些工具可以帮助它?

4

2 回答 2

1

一般来说,使用简单的时间比较来测量性能,例如endTime-beginTime,对于粗略估计来说总是一个好的开始。

稍后您可以使用分析器(例如Valgrind)来衡量程序不同部分的执行情况。

通过分析,您可以测量程序的空间(内存)或时间复杂度、特定指令的使用或函数调用的频率/持续时间。

如果您想要使用 GUI 进行更高级的分析功能,还有AMD CodeAnalyst 。它是免费/开源的。

于 2013-07-20T14:12:44.750 回答
0

有几种工具(除其他外)可以为您进行分析:

其中一些需要特定的编译方式或特定的编译器。其中一些特别擅长针对给定的处理器架构(AMD / Intel ...)进行分析。

由于您似乎可以访问 C++11,并且如果您只想测量一些时间,您可以使用std::chrono.

#include <chrono>
#include <iostream>
class high_resolution_timer
{
private:
  typedef std::chrono::high_resolution_clock clock;
  clock::time_point m_time_point;
public:
  high_resolution_timer (void) 
    : m_time_point(clock::now()) { }
  void restart (void) 
  { 
    m_time_point = clock::now(); 
  }
  template<class Duration>
  Duration stopover (void) 
  { 
    return std::chrono::duration_cast<Duration>
           (clock::now()-m_time_point);  
  }
}; 

int main (void)
{
  using std::chrono::microseconds;
  high_resolution_timer timer;

  // do stuff here

  microseconds first_result = timer.stopover<microseconds>();
  timer.restart();

  // do other stuff here

  microseconds second_result = timer.stopover<microseconds>();

  std::cout << "First took " << first_result.count() << " x 10^-6;";
  std::cout << " second took " << second_result.count() << " x 10^-6.";
  std::cout << std::endl;

}

但是您应该知道,优化几毫秒的整体运行时间几乎没有意义(如果您的程序运行时间将> = 1s)。相反,您应该在代码中计时高度重复的事件(如果有的话,或者至少是那些成为瓶颈的事件)。如果这些显着改善(这可以是毫秒或微秒),您的整体性能也可能会提高。

于 2013-07-20T15:41:50.600 回答