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/