From: "NAKAMURA, Hiroshi" Date: 2002-11-20T01:18:18+09:00 Subject: [ruby-dev:18850] Re: CFD: adding "condition", "block-call/return", and "load-call/return" trace-events なひです。 > From: "Yukihiro Matsumoto" > Sent: Monday, November 18, 2002 2:08 PM > |1.7のほうのeval.cに、いくつかtraceイベント発生用の > |コードを修正/変更したいです。複数の項目があります。 > |追加すべきものかどうかという議論に加え、実装が > |正しいのかどうかの議論/チェックもお願いしたいです。 > |特に6、7が怪しい。^^; > > 新しいイベントを増やすのはできるだけ避けたい。今の枠組みでは > イベントが増えれば増えるほど(飛躍的に)遅くなりますから。むし > ろ、イベントごとに独立したハンドラを設定できるようにしてから > 増やすことを考えたいです。 流れとしては、まずはイベント種別毎にイベントハンドラを 登録できるようにする、というところで止まっています。 あれやったりこれやったりで全然進んでませんが、 とりあえずパフォーマンス測定をしてみました。 題材はprofile.rbです。現状の配布物でイベントハンドラを使う profile.rb、debug.rbとtracer.rbのうち、 debug.rbとtracer.rbは[ruby-dev:18826]に書いたとおり、 イベントハンドラの個別登録にしたとしても、ほとんど影響を 受けないからです(どうせ全部登録する)。 プロファイルを取った対象は、手前味噌でcsvモジュールの 単体テスト(tests/csv_ut.rb)です。この単体テストを、 profile.rbによるトレースをさせながら走らせた結果を計測しました。 マシンはULV Mobile Pentium 3-M 800MHのなひノートPC。 SpeedStepの効果は切ってあります。 計測は、各種条件でコンパイルしなおした ruby 1.7.3 (2002-11-14) [i386-cygwin] (enable-shared)を使い、Cygwin bash上で time ruby17 -r./profile csv_ut.rb などとして3度連続して行いました。 ./profile.rbは、ENDブロックを削除して、トレース後の 結果表示を行わない、トレース部分だけを取り出したものです。 □現行ruby 1.7.3 (2002-11-14)で、profile.rbなし 0.951 [sec] 0.851 [sec] 0.921 [sec] □現行ruby 1.7.3 (2002-11-14)で、profile.rbあり 102.667 [sec] 102.627 [sec] 102.937 [sec] □現行ruby 1.7.3 (2002-11-14)に、[ruby-dev:18818]で なひがリクエストしたcondition、rescue、load-call/load-return を追加したもので、profile.rbあり 110.929 [sec] 111.309 [sec] 110.999 [sec] □現行ruby 1.7.3 (2002-11-14)において、profile.rbで利用する call/return、c-call/c-returnのみ残し、残りのイベント発生 コードを全て削除したもの(if (trace_func)判定も削除)で、 profile.rbあり 81.977 [sec] 81.817 [sec] 81.927 [sec] まず、[ruby-dev:18818]でのなひの追加による実行時間増加は 8.2%ですから、飛躍的にとまでは遅くなっていないと思います。 ません?^^; また、イベント種別別にイベントハンドラを登録できるようにする ことの効果は、現行からで20%、[ruby-dev:18818]のpatch後からで 26%の実行時間削減でした。この結果をどう見るかは意見の分かれる ところかもしれません。イベント種別別にイベントハンドラを登録 できるようにするために、あまり凝った実装をすると、この26%の マージンですら食いつぶすかもしれません。 上記条件の下で、[ruby-dev:18818]のpatchをあてたrubyでの イベントの通知数は以下の通りです。 class/end: 101 line: 222271 call/return: 36698 c-call/c-return: 547640 raise/rescue: 140 condition: 84208 load-call/load-return: 33 c-call/c-returnが飛びぬけて多いですね。 でもこれを削るわけにはいかない。 ともあれ、時間の取れたときにイベント種別々イベントハンドラ 登録の実装をしてみます。