まつもと ゆきひろです

以前プロファイラが欲しいって方がいらっしゃいましたよね.

その時には「デバッガと同じ仕組みで原理的には実現できるはずだ
が,Cで記述されたメソッドの取扱いなどで現状ではまだできない」
と答えたように思うのですが,昨夜Ruby本の原稿の話の流れの都合
上やっぱりプロファイラが欲しいという結論になったので,インタ
プリタそのものに手をいれて実装してみました.

残念なことに未公開の1.1d0以降でないと動かないので,まだお見
せするわけにはいかないのですが,たとえば以下のようなイメージ
になります.

  % ruby -r profile sample/fact.rb 4
  24
    %   cumulative   self              self     total
   time   seconds   seconds    calls  ms/call  ms/call  name
   41.31      0.01     0.00        1     4.98     7.03  Object#fact
    8.11      0.00     0.00        1     0.98     1.35  main.print
    6.77      0.00     0.00        5     0.16     0.16  Fixnum#>
    4.69      0.00     0.00        4     0.14     0.14  Fixnum#*
    4.43      0.00     0.00        4     0.13     0.13  Fixnum#-
    3.08      0.00     0.00        1     0.37     0.37  Fixnum#to_s
    1.44      0.00     0.00        1     0.17     0.17  String#to_i
    1.38      0.00     0.00        1     0.17     0.17  Module#method_added
    1.25      0.00     0.00        1     0.15     0.15  Array#[]
    1.09      0.00     0.00        1     0.13     0.13  Fixnum#==
    0.00      0.01     0.00        1     0.00    12.06  toplevel

これはproof of conceptレベルなんで,gprofのようなcall treeを
見せてくれたりしませんが,今後の機能拡張は可能だと思います
(profile.rbはたった49行).全部Rubyで書いてあるのでやや精度が
悪い上,遅いのですが.

ついでに1.1d0の予告をすると

  * grand renaming

    すべてのglobal symbolにrb_またはruby_のprefix

  * 高速化

    いくつかの部分(ブロック呼び出し,メソッド呼び出しなど)が
    ややチューンアップされてます.

  * プロファイラ

   前述の通り.まだおもちゃですけど.

が特長です.あと,1.1d0でだけ直ってるバグもいくつかあります.
たとえばソートルーチン内での配列要素変更の禁止とか.

1.1d0のリリースはまだ未定です.1.1c5を出して1.1cシリーズが一
応安定してからになるでしょうね.

                                まつもと ゆきひろ /:|)