From: Tomoyuki Chikanaga Date: 2010-03-10T10:11:32+09:00 Subject: [ruby-dev:40591] Re: Fast Exception creation with raw backtrace 近永と申します。 >  そこで,例外オブジェクト生成時には「読みやすいバックトレース」を生成す > るのに必要な情報だけを持っておき,本当に「読みやすいバックトレース」を必 > 要としたときに初めて作る,というようにしました. 高速になるのは嬉しいです。 ただ dRuby 経由のメソッド呼び出しで例外を返す時に、Exception が Masrhal できないと DRbRemoteError に変換されてしまうので、困る ことがありそうです。 set_backtrace で「読みやすいバックトレース」がセットされたら Marshal 可能になるとか、『「読みやすいバックトレース」を生成するのに 必要な情報』の部分がオブジェクトになってて、そこだけ DRbObject で 参照渡しできるなど回避方法があればいいと思います。 # dRuby 経由で、特にメソッド呼び出しの深い位置での例外が遅いのを # 時々感じているので、できたら後者だと嬉しいです。 >  以下のページに評価結果を書きました.それなりに効果があるようです. > http://www.atdot.net/~ko1/diary/protect/201003.html#d10 この URL だとパスワードを要求されました。 多分こっちですよね。 http://www.atdot.net/~ko1/diary/201003.html#d10 >  デフォルトでは問題無いと思うのですが,Exception#set_backtrace が再定義 > されていると問題になるかもしれません.が,そういう用途があるかはよくわか > りません. 再定義されている例には心当たりありませんが、例外のクラスを 途中で切り替えつつバックトレースは元の例外のものにするということを 以下のようにしていることがあります。 begin ... rescue HogeError raise FooError, "msg: #{$!.message}", $@ # または err = FooError.new("msg: #{$!.message}") err.set_backtrace($@) raise err end こうするとこの時に一旦「読みやすいバックトレース」が生成されて それをセットすることになると思いますので、「元の必要な情報」だけを 引き継ぐ方法があれば無駄がなくていいなー、とは思います。 ただ違う書き方をしないといけなくなると思うので、その恩恵に あずかるにはスクリプトを書き替えないといけませんけど。 以上。 Chikanaga Tomoyuki