2009-04-08 20 views
6

私はCPUプロファイリングのためにgoogleのperftools(http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html)を使用しています。これは素晴らしいツールです。私のアプリケーション。C++プロファイリング/最適化:最適化された関数で精度の高いプロファイリング精度を得る方法

残念ながら、私は、コードがまだ少し遅いということを知りました。そして、g ++の-O3最適化レベルを使用してコンパイルすると、特定の関数は遅いですが、 。

-O3フラグを削除した場合、プログラムの最適化されていない部分がこの機能を追い越し、機能の実際の部分がはるかにはっきりしません。 -O3フラグをそのままにしておくと、関数の遅い部分がインライン展開され、関数のどの部分が遅いのかを判断できません。

提案がありますか?ご協力いただきありがとうございます!あなたは現在の時刻(またはCPUTIME)を測定様々なポイントステートメントで測定したいルーチンに

インサート:このような何かのために

答えて

5

Linuxの場合は、oprofileを使用してください。 Windowsの場合は、AMDのCodeAnalystを使用してください。

両方とも、サンプルベースのプロファイルを個々のソース行またはアセンブリ命令のレベルまで下げます。機能内の「ホットスポット」の識別に問題はありません。

+0

私はCodeAnalystについて話すことができませんが、oprofileは素晴らしいです! opannotateコマンドは、あなたが記述したのと同じように私にソース行アノテーションを与えました。ありがとう! – Adam

+1

CodeAnalystは、特別なバージョンのoprofile上のGUIです。 LinuxではCodeAnalystを使用することもできます。 – Carlos

6

は、私はいつもそれを行うための「古い学校」の方法を使用しました。次に、それらの違いをプリントアウトしたりログしたりするだけで、コードの各セクションがどのくらいの時間を取ったかが分かります。そこから、ほとんど何を食べているのかを知ることができ、問題が何であるかを知り、それを修正するまで、そのセクション内のきめ細かなタイミングを得ることができます。

関数呼び出しのオーバーヘッドが問題でない場合は、インライン展開を-fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inlineで強制的にオフにすることもできます(これらのスイッチがどのように相互作用しているかわかりませんが、独立していると思います)。次に、通常のプロファイラを使用して、コールグラフのプロファイルを見て、どのような関数呼び出しが時間を費やしているかを確認することができます。

+0

ありがとうございましたGreg! oprofile(以下)のためにされていない場合、私はあなたが示唆した精密タイミングのアイデアのために行っただろうと思う。 – Adam

1

パフォーマンスのチューニングに何十年も費やしました。

人々はツールが大好きですが、私はthis methodで誓います。