簡易プロファイラ for T-Kernel

[ 日本語 | English ]

概要

T-Kernel用の簡易的なプロファイラです。(前のバージョンに比べ、空間効率がかなり良くなっています。)

動作環境
T-Kernel/x86 (ただし、比較的簡単に他T-Kernel環境にも対応できるはず。)
ライセンス
MIT License にします。
ダウンロード

コンパイル方法

vfdrv はデバイスドライバ、vfswitch はプロセスなので、それぞれ $BD/driver/, $BD/bappl/ 内で展開・コンパイルしてください。

使い方

  1. あらかじめ、lodspg vfdrv しておきます。
  2. 次に、プログラムを実行し、プロファイル情報を記録します。やり方は二通りあります:
    A) プログラム本体に手を加える
    vfswitch.tar.gzを参考にして、プロファイルをとる開始・終了時点に必要なコードを加えてください。vf_{open,start,stop,save,close}がそれです。マルチタスクなプログラムの全体のプロファイルをとる場合には、タスクIDを適切に書き加え/削除してやる必要があります。
    B) プログラム本体には手を入れず、外部からプロファイルをとる
    プログラムを実行し、「ref tsk」を実行するなどして、対象のタスクIDを入手します。ここでタスクIDが123であったと仮定すると、
    $ vfswitch on 123
    のようにしてプロファイルを開始します。
    プロファイルを終了する時には、
    $ vfswitch off
    を実行すればOKです。
  3. 生成されたプロファイル情報 (/SYS/vf.out) を、開発環境(Linux/Cygwin)側に転送します。(例↓)
    [/SYS]% fput vf.out 192.168.1.50:/home/takeshi/
  4. 最後に、以下のような感じで適当に結果を読めばOKです。
    [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>
Last modified: Fri Nov 25 06:57:20 2011
Valid XHTML 1.0!