2014-08-20
君たちの愛したmruby-profilerは復活した(その3)
|では、どうやってIREP構造体とprof_irep構造体を結びつけたのでしょうか?この説明の前にIREP構造体とは何かを思い出してみましょう。IREP構造体はVMの命令の一塊をVMが扱いやすいように補助的な情報とともにまとめたものでした。IREP構造体はメソッドとかブロックのVMが扱いやすい形式ともいえます。こういうことから、あるcode_fetch_hookの呼び出しとその前のcode_fetch_hookで渡ってくるIREP構造体が違う場合、次のような原因が考えられます。
つまり、code_fetch_hookにあるIREP構造体(ここではAとします)が渡されたと分かっている時、次に渡ってくるIREP構造体は大体絞られるわけです。つまり、A中で呼び出しているメソッドのIREP構造体か、Aを呼び出したIREP構造体です。また、Rubyの場合あるメソッドがどのメソッドを呼び出すかは変なことをしなければ、大体静的に決まります。
そんな感じで次のような感じで結びつけます。ちょうどコールグラフを作る感じと言うとイメージしやすいかもしれません。
- prof_irep構造体に次のようなメンバーを加える。prof_irepはmruby-profiler側で定義するのでメンバーの増減は自由自在です。
- code_fetch_hook中ではcurrent_prof_irepに対応するIREP構造体と引数で渡ってきたIREP構造体が違うか調べる。同じなら問題ない。違うならprof_irep構造体を探さないといけない。探す手順はこんな感じ
- current_prof_irepのchildメンバーの配列に入っているprof_irep構造体を調べる。もしchild中のprof_irep構造体が探しているIREP構造体に対応するものなら、current_prof_irepをそのprof_irep構造体にして検索終わり
- childメンバーになければ、parentメンバーに入っているprof_irep構造体を同様に調べる。なければさらにpraentを辿り呼び出し履歴の最後まで調べる。見つかれば、childの時と同じでcurrent_prof_irepに設定する。
- 見つからなければ、新たにprof_irep構造体を作り、current_prof_irepのchildの配列に加える
いろんな疑問点もあるでしょう。想定問答集です。
でっかいメソッドを作る方が悪い
- この方法だとあるIREP構造体に対応するprof_irep構造体がたくさんできない?
はい出来ます。ただし、無限に出来ることはないはずです。最後に結果を表示するときに集計する必要があるでしょう。逆にgprofのようなコールパスごとの実行時間も得られるはずです。まだ実装していませんが。
- IREP構造体がGCされちゃったら大丈夫?
うっ!それは・・・
- 勘のいいガキは嫌い?
はい!
そういうわけで、IREP構造体がGCされるとまずいのでIREP構造体中の参照カウンタをいじってGCされないようにしています。mruby-profilerからだとIREP構造体がGCされたかわかる方法が無いので仕方が無いですね。ファイナライザーがあればいいのですが
と、最後はいいわけになってしまいましたが、無事終わりました。それではごきげんよー
- 130 https://www.google.co.jp/
- 59 http://news.google.com/
- 40 http://www.kt.rim.or.jp/~kbk/zakkicho/
- 39 http://www.rubyist.net/~kazu/samidare/
- 27 http://www.kt.rim.or.jp/~kbk/zakkicho/index.html
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDEQFjAC&url=http://d.hatena.ne.jp/miura1729/20080610/1213091022&ei=_8P2U8HaNpO-uASm4YD4DA&usg=AFQjCNE05QRueqNDOoUk7mTb70YSXdeW2Q&sig2=l5NAQlBBr94hOh8NqfuRtg&bvm=bv.73373277
- 25 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&sqi=2&ved=0CB0QFjAA&url=http://d.hatena.ne.jp/miura1729/20071203/1196683062&ei=oJb9U-SYC5W58gWDjYKgAQ&usg=AFQjCNEDHmJUJVPzWOjDBsLZwN7KclLfPg&bvm=bv.74035653,d.dGc
- 16 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=24&ved=0CDMQFjADOBQ&url=http://d.hatena.ne.jp/miura1729/20080302/1204443134&ei=cJX5U-uBCMS6uAT_5oGIBw&usg=AFQjCNGs0UvrBPmP4lzSmAtX2Z-iaNNOvA&bvm=bv.73612305,d.c2E
- 16 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEQQFjAD&url=http://d.hatena.ne.jp/miura1729/20130503/1367581053&ei=Y5L1U7GMGZGIuATrwIGIBA&usg=AFQjCNG2PO3Xh1_KgCwkgrTmWwUynlEpJQ&sig2=C5VgtlAvYpcEkDQ060HPnA
- 15 http://www.google.co.jp/url?url=http://d.hatena.ne.jp/miura1729/20080726/1217085384&rct=j&frm=1&q=&esrc=s&sa=U&ei=-0T3U6uoD4rGuAT2xoKYCg&ved=0CCgQFjAE&usg=AFQjCNGxu1MFWAE0NKoYMj0lk6nr0Lp-PA