私はアルゴリズムとデータ構造を真剣に研究し始めており、A&DTを実装するさまざまな方法のパフォーマンスを比較する方法を学ぶことに興味があります。
単純なテストの場合、何かが実行される前/後の時間を取得し、そのものを10 ^ 5回実行し、実行時間を平均化できます。サイズによって入力をパラメーター化するか、ランダム入力をサンプリングして、実行時間と入力サイズのリストを取得できます。それをcsvファイルとして出力し、パンダにフィードできます。
警告がないかどうかはわかりません。 space複雑さを測定する方法についてもわかりません。
私はC++でプログラミングすることを学んでいます。私がやろうとしていることを達成するための人道的なツールはありますか?
ベンチマークコードは簡単ではありません。私が最も役に立ったのは Googleベンチマークライブラリです。 使用する予定がなくても、いくつかの例を読むとよいでしょう。テストのパラメーター化、ファイルへの出力結果、さらにアルゴリズムのBig O表記の複雑さを返す可能性はたくさんあります(ほんの数例を挙げれば)。 Googleのテストフレームワークに精通している場合は、それを使用することをお勧めします。また、コンパイラの最適化を管理できるため、コードが最適化されていないことを確認できます。
CppCon 2015:Chandler Carruth "Tuning C++:Benchmarks、and CPUs、and Compilers!Oh My!" には、ベンチマークコードに関する素晴らしい講演もあります。起こり得る間違いには多くの洞察があります(Googleベンチマークも使用しています)
これは、オペレーティングシステムとコンパイラに固有です(実装に固有)。 プロファイリング ツールを使用したり、タイミングツールを使用したりできます。
Linuxでは、 time(1) 、 time(7) 、 perf(1) 、 gprof(1) を参照=、 pmap(1) 、 mallinfo(3) および proc(5) および約 GCCの呼び出し 。
this も参照してください。実際には、実行が十分に長く続くことを確認してください(たとえば、プロセスの少なくとも1秒の時間)。
最適化コンパイラ はプログラムを大幅に変換できることに注意してください。 CppCon 2017を参照してください:Matt Godboltの講演 「私のコンパイラーは最近何ができましたか?コンパイラーの蓋を外す」
アーキテクチャの観点から言えば、 Intel Pin 、 perf tool などのさまざまなアーキテクチャツールを使用してC++コードをベンチマークすることもできます。これらのツールを使用して、コードのアーキテクチャ依存性を調べることができます。たとえば、さまざまなレベルの最適化のためにコードをコンパイルし、IPC/CPI、キャッシュアクセス、ロードストアアクセスをチェックできます。ライブラリ関数が原因でコードのパフォーマンスが低下していないかどうかを確認することもできます。これらのツールは強力であり、コードに対する大きな洞察を潜在的に与えることができます。
また、コードを分解して、コードがほとんどの時間を費やしている場所を調べて、それを最適化することもできます。さまざまな手法を調べて、頻繁にアクセスされるデータがキャッシュに残っていることを確認して、高いヒット率を確保できます。
たとえば、コードがループに大きく支配されていることに気付いたら、2つのケースで異なるループ境界に対してコードを実行し、メトリックを確認できます。たとえば、ループ境界を100,000に設定して目的のパフォーマンスメトリック「X」を見つけ、次にループ境界を200,000に設定してパフォーマンスメトリック「Y」を見つけます。次に、Y-Xを計算します。これにより、2つのメトリックを差し引くことにより、コードの静的な影響を効果的に取り除くことができるため、ループの動作をよりよく理解できます。
たとえば、コードを10回実行し、ユーザー入力サイズを変えたとします。ユーザー入力あたりの実行時間を見つけて、この新しいメトリックを昇順に並べ替え、最初と最後の値を削除して(外れ値を削除する)、平均をとることができます。最後に、分散係数を見つけて、ランタイムの動作を理解します。
余談ですが、多くの場合、「平均」または「算術平均」rashlyという用語を使用します。平均化する予定のメトリックを確認し、それぞれの場合の調和平均、算術平均、および幾何平均を確認します。たとえば、レートの算術平均を見つけると、間違った答えが返されます。時間内に等しく発生しない2つのイベントの算術平均を見つけるだけでは、誤った結果が生じる可能性があります。代わりに、加重算術平均を使用してください。