2

プログラムを書いて、コードの「最適化」を行うとします。私の場合std::move、C++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;

}

ただし、実行時間全体の数ミリ秒を最適化してもほとんど意味がないことに注意してください (プログラムの実行時間が 1 秒以上になる場合)。代わりに、コード内で非常に反復的なイベントの時間を計る必要があります (存在する場合、または少なくともボトルネックとなるイベントがある場合)。これらが大幅に改善された場合 (これはミリ秒またはマイクロ秒単位である可能性があります)、全体的なパフォーマンスも向上する可能性があります。

于 2013-07-20T15:41:50.600 に答える