まつもと ゆきひろです
以前プロファイラが欲しいって方がいらっしゃいましたよね.
その時には「デバッガと同じ仕組みで原理的には実現できるはずだ
が,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シリーズが一
応安定してからになるでしょうね.
まつもと ゆきひろ /:|)