私はレイトレーサーを書いています。
最近、i5クアッドコアの追加コアを活用するために、プログラムにスレッドを追加しました。
奇妙な出来事の中で、アプリケーションのデバッグバージョンの実行速度は遅くなりましたが、最適化されたビルドは、スレッドを追加する前よりも速く実行されています。
デバッグビルドの場合は「-g-pg」フラグをgccに渡し、最適化ビルドの場合は「-O3」フラグを渡します。
ホストシステム:Ubuntu Linux10.4AMD64。
デバッグシンボルがプログラムにかなりのオーバーヘッドを追加することは知っていますが、相対的なパフォーマンスは常に維持されています。つまり、より高速なアルゴリズムは、デバッグビルドと最適化ビルドの両方で常に高速に実行されます。
なぜ私がこの振る舞いを見ているのか、何か考えはありますか?
デバッグバージョンは「-g3-pg」でコンパイルされます。「-O3」で最適化されたバージョン。
Optimized no threading: 0m4.864s
Optimized threading: 0m2.075s
Debug no threading: 0m30.351s
Debug threading: 0m39.860s
Debug threading after "strip": 0m39.767s
Debug no threading (no-pg): 0m10.428s
Debug threading (no-pg): 0m4.045s
これは、「-g3」が奇妙なパフォーマンスデルタのせいではなく、むしろ「-pg」スイッチであることを私に確信させます。「-pg」オプションは、スレッドのパフォーマンスを測定するための何らかのロックメカニズムを追加する可能性があります。
とにかくスレッド化されたアプリケーションでは「-pg」が壊れているので、削除します。