C ++プロファイリング/最適化:最適化された機能に優れたプロファイリングの粒度を取得する方法
-
06-09-2019 - |
質問
私はGoogleのperftools( HTTPを使用しています.googlecode.com / SVN /トランク/ DOC / cpuprofile.html の)CPUプロファイリング---それは私が自分のアプリケーションにCPU時間の改善の多くを行う助けた素晴らしいツールだ。
残念ながら、私はコードがまだ少し遅いという点まで得ている、とg ++の-O3最適化レベルを使用してコンパイルする場合、私が知っているすべては、それの側面が遅いである特定の機能が遅いということですが、ありません。
私は-O3フラグを削除する場合はは、その後、プログラムの最適化されていない部分は、この関数をオーバーテイクし、私が遅い関数の実際の部分に明確さの多くを得ることはありません。私は-O3フラグを残す場合は、関数の遅い部分がインライン化され、そしてIは、機能の部分が遅いかを決定することができない。
任意の提案ですか?あなたの助けをありがとう!
解決
あなたは、Linuxにしている場合は、 OProfileののを使用しています。 Windowsであれば、AMDの CodeAnalyst に使用します。
の両方が、個々のソース行またはアセンブリ命令のレベルまでのサンプルベースのプロファイルを与える、あなたは関数内の「ホットスポット」を特定する問題はないはずです。
他のヒント
このような何かのために、私はいつもそれを行うための「古い学校」の方法を使用しました
あなたは現在の時刻(またはCPUTIME)を測定様々なポイントステートメントで測定したいルーチンに挿入します。そして、単純に印刷したり、それらの違いを記録し、あなたは、コードの各セクションがかかった時間を知っているだろう。そこからは、ほとんどの時間を食べているかを調べると、中に入ると、あなたは問題が何であるかを知っている、そしてそれを修正する方法まで、そのセクション内きめの細かいタイミングを取得することができます。
機能のオーバーヘッドが問題ではありません呼び出した場合は、、あなたも(私はこれらのスイッチがどのように相互作用するか正確にわからないんだけど、私は彼らが独立していると思います)-fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline
をオフにインライン化を強制することができます。そして、あなたは、コールグラフプロファイルを見て、関数呼び出しは、どの程度の時間を取っているかを見るためにあなたの通常のプロファイラを使用することができます。