2

みなさん、gprof を実行して、2 つの異なる最適化レベル (-g -pg と -O3 -pg) で実行時間のパーセンテージを確認しています。

そのため、O3 では 1 つの関数に 68% の ex-time がかかるが、-g バージョンでは 9% しかかからないという結果が得られました。

その背後にある理由を見つける方法がわかりません。コンパイルする前に2つのバージョンファイルを比較することを考えていますが、cmdがそうするかどうかわかりません。

この実行時間の違いの理由を見つける他の方法はありますか。

4

2 に答える 2

5

最適化フラグを使用している場合は、gprof/プロファイリングの結果を慎重に解釈する必要があります。-O3 を指定してコンパイルすると、コードの構造が実際に変更される可能性があるため、gprof がどこでどれだけの時間が費やされたかを知ることは不可能です。

特に、より高い最適化レベルで関数のインライン化を有効にすると、一部の関数がインライン コードに完全に置き換えられるため、まったく時間がかからないように見えます。これらの子関数で費やされる時間は、それらを呼び出す親関数に起因するため、特定の親関数で費やされる時間が実際に増加したように見えることがあります。

これについて本当に良いリファレンスを見つけることができませんでした。これは古い例の 1 つです:
http://gcc.gnu.org/ml/gcc/1998-04/msg00591.html
そうは言っても、-O3 で gprof を実行すると、この種の奇妙な動作が予想されます。この種の影響を最小限に抑えるために、私は常に -O1 最適化だけでプロファイリングを行います。

于 2012-09-19T00:15:00.560 に答える
1

あなたの推論には根本的な欠陥があると思います.最適化されたバージョンでは実行時間が68%であるのに対し、最適化されていないバージョンではわずか9%であるという事実は、最適化されていないバージョンの方がパフォーマンスが優れていることを意味します.

代わりに、-O3 バージョンの方が絶対的にはパフォーマンスが優れていると確信していますが、オプティマイザは他の関数でより優れた仕事をしたため、最適化されたコードの残りの部分に比例して、指定されたサブルーチンの結果が遅くなります -しかし、実際には、最適化されていないバージョンよりも高速です。少なくとも同じくらい高速です。

それでも、出力されたコードの違いを直接確認するには、-Sスイッチを使用できます。また、私の考えが正しいかどうかを確認するために、-O0 と -03 の関数にかかった CPU 時間を大まかに比較して、そのパーセンテージを次のようなコマンドによって提供されるプログラムにかかったユーザーtime時間で乗算します(また、私はかなりgprofのサブルーチンで費やされた絶対時間の測定値を取得できることを確認してください.IIRCはデフォルト出力にもありました).

于 2012-09-14T23:28:54.263 に答える