web-dev-qa-db-ja.com

C ++コードのパフォーマンスをベンチマークするにはどうすればよいですか?

私はアルゴリズムとデータ構造を真剣に研究し始めており、A&DTを実装するさまざまな方法のパフォーマンスを比較する方法を学ぶことに興味があります。

単純なテストの場合、何かが実行される前/後の時間を取得し、そのものを10 ^ 5回実行し、実行時間を平均化できます。サイズによって入力をパラメーター化するか、ランダム入力をサンプリングして、実行時間と入力サイズのリストを取得できます。それをcsvファイルとして出力し、パンダにフィードできます。

警告がないかどうかはわかりません。 space複雑さを測定する方法についてもわかりません。

私はC++でプログラミングすることを学んでいます。私がやろうとしていることを達成するための人道的なツールはありますか?

12
alpha

ベンチマークコードは簡単ではありません。私が最も役に立ったのは Googleベンチマークライブラリです。 使用する予定がなくても、いくつかの例を読むとよいでしょう。テストのパラメーター化、ファイルへの出力結果、さらにアルゴリズムのBig O表記の複雑さを返す可能性はたくさんあります(ほんの数例を挙げれば)。 Googleのテストフレームワークに精通している場合は、それを使用することをお勧めします。また、コンパイラの最適化を管理できるため、コードが最適化されていないことを確認できます。

CppCon 2015:Chandler Carruth "Tuning C++:Benchmarks、and CPUs、and Compilers!Oh My!" には、ベンチマークコードに関する素晴らしい講演もあります。起こり得る間違いには多くの洞察があります(Googleベンチマークも使用しています)

7
wdudzik

これは、オペレーティングシステムとコンパイラに固有です(実装に固有)。 プロファイリング ツールを使用したり、タイミングツールを使用したりできます。

Linuxでは、 time(1)time(7)perf(1)gprof(1) を参照=、 pmap(1)mallinfo(3) および proc(5) および約 GCCの呼び出し

this も参照してください。実際には、実行が十分に長く続くことを確認してください(たとえば、プロセスの少なくとも1秒の時間)。

最適化コンパイラ はプログラムを大幅に変換できることに注意してください。 CppCon 2017を参照してください:Matt Godboltの講演 「私のコンパイラーは最近何ができましたか?コンパイラーの蓋を外す」

アーキテクチャの観点から言えば、 Intel Pinperf tool などのさまざまなアーキテクチャツールを使用してC++コードをベンチマークすることもできます。これらのツールを使用して、コードのアーキテクチャ依存性を調べることができます。たとえば、さまざまなレベルの最適化のためにコードをコンパイルし、IPC/CPI、キャッシュアクセス、ロードストアアクセスをチェックできます。ライブラリ関数が原因でコードのパフォーマンスが低下していないかどうかを確認することもできます。これらのツールは強力であり、コードに対する大きな洞察を潜在的に与えることができます。

また、コードを分解して、コードがほとんどの時間を費やしている場所を調べて、それを最適化することもできます。さまざまな手法を調べて、頻繁にアクセスされるデータがキャッシュに残っていることを確認して、高いヒット率を確保できます。

たとえば、コードがループに大きく支配されていることに気付いたら、2つのケースで異なるループ境界に対してコードを実行し、メトリックを確認できます。たとえば、ループ境界を100,000に設定して目的のパフォーマンスメトリック「X」を見つけ、次にループ境界を200,000に設定してパフォーマンスメトリック「Y」を見つけます。次に、Y-Xを計算します。これにより、2つのメトリックを差し引くことにより、コードの静的な影響を効果的に取り除くことができるため、ループの動作をよりよく理解できます。

たとえば、コードを10回実行し、ユーザー入力サイズを変えたとします。ユーザー入力あたりの実行時間を見つけて、この新しいメトリックを昇順に並べ替え、最初と最後の値を削除して(外れ値を削除する)、平均をとることができます。最後に、分散係数を見つけて、ランタイムの動作を理解します。

余談ですが、多くの場合、「平均」または「算術平均」rashlyという用語を使用します。平均化する予定のメトリックを確認し、それぞれの場合の調和平均、算術平均、および幾何平均を確認します。たとえば、レートの算術平均を見つけると、間違った答えが返されます。時間内に等しく発生しない2つのイベントの算術平均を見つけるだけでは、誤った結果が生じる可能性があります。代わりに、加重算術平均を使用してください。

4
Yash Karundia