2016-12-23 3 views
-4

C/C++コードの正確なベンチマークのために推奨される方法論/ライブラリは何ですか?単に実行時間を測定することの不正確さ、すなわちCPU周波数およびシステム負荷が実行時間にわたって変化する可能性があることを克服するもの。私のコードのボトルネックが(おそらく)メモリアクセスになるので、実行された命令のカウントが正しいアプローチであるかどうかは分かりません。C/C++コードの単純で正確なベンチマーク

+0

C/C++コードとは何ですか? –

+0

@LightnessRacesinOrbit googleそれで – fhucho

+0

今私は感謝を知っている –

答えて

3

GNUプロファイラgprofは、signle-threadedコードのパフォーマンス測定を行う伝統的な方法です。コードを手動で計測する必要はありません。ビルド中にgccにオプションを追加するだけです。

+0

-p(gprof enable)でコンパイルされないライブラリがあると、gprofを使用できないため、ライブラリ関数がベンチマークで正確に数えられない可能性があります。 –

+0

@ e.jahandarはい、トップレベル関数のみライブラリがベンチマークされます。しかし、あなたがlibのソースコードを持っていない場合は、通常、下位レベルの関数についても気にしません。実際には、システムコールやマルチスレッド化により多くの問題が生じます。 –

0

あなたが求めていることは不可能に近いです。

最新のプロセッサでは、キャッシュと仮想メモリの影響により実行時間が非常に非確定的であるためです。さらに、いくつかの演算のサイクル数は、引数の特定の値に依存します。

これは、静的なベンチマーク(ソースコードを見ているだけ)は正確ではなく、プログラムの実行を避けることができないことを意味します。その後、実行時間は実行ごとに変動します。

2回目と次回の実行が最初の実行の影響を受け、現実的な状態にならないため、数回の実行を平均しても不正確です。

実際には、「実行時間」はもう存在しません。

+0

ユーザ入力のないプログラム(私の場合)の実行時間は、確率的な方法で定義できます。 *環境*(実行前のシステム状態、入力イベントのストリーム)が与えられると、実行時間はほぼ決定的になります。したがって、実行時間は、適切な分布から選択されたランダムな環境を仮定して、予想される実行時間として定義することができます。 – fhucho

+0

単純なベンチマークでは、測定された実行時間の改善が異なる環境または変更されたプログラムの結果であるかどうかわかりません。平均化はある程度しか助けません。私が探していたのは、ランダムな環境(CPU周波数など)の影響を最小限に抑えることでした。 – fhucho

+0

CPU周波数は完全に非ランダムな唯一のパラメータです! –

-1

clock()でtickとtockを使用し、forループで関数をラップすることによって少なくとも1/10秒間実行します。これにより、ほとんどのキャッシング効果が排除されます。ただし、実際に使用すると関数が部分的にキャッシュされたコンテキストで実行されるため、必ずしもキャッシュを削除する必要はありません。それに答えるのは難しいです。

3

X86をお使いの場合、インテルV-Tuneアンプを試してみると、CまたはC++アプリケーションの詳細なマイクロアーキテクチャ解析ができます。実行時間を測定するためのCPU組み込みのパフォーマンスカウンタと、ナンバーキャッシュミスや多数のマイクロアーキテクチャレベルの情報を使用します。

+0

他のプログラムは、同じハードウェアパフォーマンスカウンタを使用することができます。例えばLinuxの 'perf stat。/ myprogram'は、プログラム全体のカウンタのデフォルトセットを測定します。 –

関連する問題