From: "mame (Yusuke Endoh)" Date: 2012-03-30T08:45:34+09:00 Subject: [ruby-dev:45467] [ruby-trunk - Feature #6218][Assigned] struct.cのrb_struct_s_members_m()について Issue #6218 has been updated by mame (Yusuke Endoh). Status changed from Open to Assigned Assignee set to Glass_saga (Masaki Matsushita) なんで今そういう無駄なコードになっているか、というのを調べるといいです。 ひょっとしたら何か意味があるのかもしれないので。 この場合 r10847 を見ると、Struct#members が文字列からシンボルを返すように 変更したことで、こういうコードになったようです。 なので、昔は意味があったけれど今は本当にただの無駄だと思われます。 コミット権もらえたらやっといてください。 -- Yusuke Endoh ---------------------------------------- Feature #6218: struct.cのrb_struct_s_members_m()について https://bugs.ruby-lang.org/issues/6218#change-25427 Author: Glass_saga (Masaki Matsushita) Status: Assigned Priority: Normal Assignee: Glass_saga (Masaki Matsushita) Category: Target version: 表題の関数ではrb_struct_s_members()で得たArrayの内容をwhile文で1要素ずつ新たなArrayにpushしていますが、 これはrb_ary_dup()で済ませられるのではないでしょうか。 パフォーマンス上のメリットもあります。 require 'benchmark' sym = :a s = Struct.new(*Array.new(100){ sym = sym.succ }) Benchmark.bm do |x| x.report do 1000.times { s.members } end end 以上のコードを実行したところ、以下の結果となりました。 trunk(r35158): user system total real 0.000000 0.000000 0.000000 ( 0.003188) proposal: user system total real 0.000000 0.000000 0.000000 ( 0.000688) patchを添付します。 -- http://bugs.ruby-lang.org/