短縮版:
Linux用の適切な時間ベースのサンプリングプロファイラーはありますか?
ロングバージョン:
私は通常、OProfileを使用してアプリケーションを最適化します。私は最近、疑問に思う欠点を見つけました。
問題はタイトなループであり、c++filtを生成してc++名をデマングルしました。別のボトルネックを追いかけているときに、偶然にコードに出くわしただけです。OProfileはコードについて異常なことを何も示さなかったので、私はそれをほとんど無視しましたが、私のコードセンスは、呼び出しを最適化して何が起こったかを確認するように指示しました。popen
c++filtのをに変更しましたabi::__cxa_demangle
。実行時間は1分以上から1秒強になりました。約x60スピードアップ。
popen
呼び出しにフラグを立てるようにOProfileを構成する方法はありますか?プロファイルデータが存在するため、OProfileは、ボトルネックがヒープとstd::string
呼び出しであると見なします(ところで、最適化すると、ランタイムが1秒未満に短縮され、2倍以上高速化されます)。
これが私のOProfile構成です。
$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536
ボトルネックを見つけた可能性のあるLinux用の別のプロファイラーはありますか?
問題は、OProfileが現在実行中のプロセスにのみサンプルを記録することだと思います。プロファイリングしているプロセスに常にサンプルを記録してほしい。したがって、プロセスが現在切り替えられている場合(IOまたはpopen
呼び出しでブロックされている場合)、OProfileはブロックされた呼び出しにサンプルを配置するだけです。
これを修正できない場合、OProfileは、実行可能ファイルがほぼ100%のCPUをプッシュしている場合にのみ役立ちます。非効率的なブロッキング呼び出しがある実行可能ファイルには役立ちません。