T-Kernel用の簡易的なプロファイラです。(前のバージョンに比べ、空間効率がかなり良くなっています。)
vfdrv はデバイスドライバ、vfswitch はプロセスなので、それぞれ $BD/driver/, $BD/bappl/ 内で展開・コンパイルしてください。
lodspg vfdrv
しておきます。$ vfswitch on 123
のようにしてプロファイルを開始します。$ vfswitch off
を実行すればOKです。[/SYS]% fput vf.out 192.168.1.50:/home/takeshi/
[takeshi@YashiroRed pcat]$ vf.rb webkit.map vf.out [001] 660[ms] ( 86.8%) : sys=100%, usr= 0% : TShellGraphics::drawBitmap(TShellBitmap*, rect const&, rect const&) [002] 20[ms] ( 2.6%) : sys=100%, usr= 0% : TShellBufferedGraphics::~TShellBufferedGraphics() [003] 20[ms] ( 2.6%) : sys=100%, usr= 0% : WebCore::Font::drawGlyphs(WebCore::GraphicsContext*, WebCore::SimpleFontData const*, WebCore::GlyphBuffer const&, int, int, WebCore::FloatPoint const&) const [004] 20[ms] ( 2.6%) : sys= 0%, usr=100% : jscyyparse(void*) [005] 10[ms] ( 1.3%) : sys= 0%, usr=100% : BMLockTmo [006] 10[ms] ( 1.3%) : sys=100%, usr= 0% : TShellGraphics::fillRectangle(int, int, int, int) [007] 10[ms] ( 1.3%) : sys= 0%, usr=100% : WebCore::cssValueKeywordID(WebCore::CSSParserString const&) [008] 10[ms] ( 1.3%) : sys= 0%, usr=100% : _mem_malloc [009] 0[ms] ( 0.0%) : sys= 0%, usr= 0% : TShellApp::cycle() [010] 0[ms] ( 0.0%) : sys= 0%, usr= 0% : TShellWebKitPanel::onWorkAreaMouseDown()この例だと、
TShellGraphics::drawBitmap
でほとんどの時間を消費しているので、最適化すべき対象はこの関数だということが分かります。(ただし、その内訳はシステム時間が100%になっているので、時間を費やしているシステムコールの呼び出し回数が構造的に減るようにしないと解決できないことがわかります。)仕組みは非常に単純で、周期ハンドラでタスクの PC (program counter) を定期的にチェック・記録することで、あとからどの関数にどれくらい滞在していたかを調べます。(Linux でいう sysprof と同じ仕組みです。ただし、あちらはシステム全体のプロファイリングを行います)
仕組み上、gprof などとは異なり関数の呼び出し回数などを取得することはできないという欠点があります。ただし、カーネルレベルで動作するアプリケーションに対してもプロファイルをとれる(外部プロセスから tid を指定してやればよい)・コードや実行バイナリに改変が加わらない、といった長所もあるので、使い分ければ良いと思います。
[ 戻る ]
Yashiro Takeshi <yashiromann@gmail.com>