Issue #10470 has been updated by Tomohiro Hashidate. 添付したパッチと同じ様にEXEC_EVENT_HOOKを追加して性能測定をしてみました。 測定にはbenchmark-ipsというgemを使って、100msでの実行命令数を計測しています。 測定に使ったソースコードは以下の通りです。 ~~~ require 'benchmark/ips' class Foo attr_accessor :hoge def bar @bar end def initialize(val) @bar = val end end foo = Foo.new("FOO") trace = TracePoint.new(:return, :c_return) do |tp| [tp.lineno, tp.defined_class, tp.method_id, tp.event, tp.binding, tp.return_value] end Benchmark.ips do |x| x.report("tracing access") do |time| trace.enable do foo.bar foo.hoge = "hoge#{time}" foo.hoge end end end ~~~ ## 結果 トレースを実行している場合としていない場合、EXEC_EVENT_HOOK有の場合と無しの場合の組み合わせで実行しています。 ### trace.enable, EXEC_EVENT_HOOK無し ~~~ Calculating ------------------------------------- tracing access 25.401k i/100ms ------------------------------------------------- tracing access 8.873B (±26.2%) i/s - 25.151B ~~~ ### trace.enable, EXEC_EVENT_HOOK有り ~~~ Calculating ------------------------------------- tracing access 18.765k i/100ms ------------------------------------------------- tracing access 4.404B (±26.9%) i/s - 12.809B ~~~ ### trace無し, EXEC_EVENT_HOOK無し ~~~ Calculating ------------------------------------- tracing access 108.694k i/100ms ------------------------------------------------- tracing access 108.487B (±18.8%) i/s - 187.556B ~~~ ### trace無し, EXEC_EVENT_HOOK有り ~~~ Calculating ------------------------------------- tracing access 104.899k i/100ms ------------------------------------------------- tracing access 104.985B (±18.4%) i/s - 183.617B ~~~ トレースを実行している場合は倍程度パフォーマンスに差があります。 トレースをしていない場合にも、2,3%程度性能劣化してる感じです。 ---------------------------------------- Bug #10470: TracePoint cannot trace attr_accessor/reader/writer method https://bugs.ruby-lang.org/issues/10470#change-50915 * Author: Tomohiro Hashidate * Status: Assigned * Priority: Normal * Assignee: Koichi Sasada * Category: core * Target version: current: 2.2.0 * ruby -v: ruby 2.2.0dev (2014-11-01 trunk 48219) [x86_64-darwin13] * Backport: 2.0.0: REQUIRED, 2.1: REQUIRED ---------------------------------------- TracePointを利用して`attr_accessor`で定義したメソッドの`:c_call`, `:c_return`イベントを取得することができません。 ```ruby class Foo attr_accessor :hoge def bar @bar end def initialize(val) @bar = val end end foo = Foo.new("FOO") trace = TracePoint.new(:return, :c_return) do |tp| p [tp.lineno, tp.defined_class, tp.method_id, tp.event, tp.binding, tp.return_value] end trace.enable do foo.bar foo.hoge = "hoge" foo.hoge end ``` 上記のコードを実行した時、attr_accessorで定義した`hoge`メソッドのイベントが発生しません。 調査した所、`EXEC_EVENT_HOOK`の呼び出し自体が無いようです。 このため、例えばpower_assertを利用した時にアクセサメソッドの戻り値を取得できない等の問題が発生します。 attributeの読み書きを行う処理の中に`EXEC_EVENT_HOOK`を呼び出す簡単なパッチを書きましたので、添付します。 ---Files-------------------------------- fix_attr_accessor_event.diff (1.98 KB) -- https://bugs.ruby-lang.org/