以下のように depth をキャッシュしておく。b_call, b_return は method_id などで区別がつけられないのでキャッシュしない。’
def get_depth key
if @depth_map[key]
return @depth_map[key]
end
depth = caller.size
@depth_map[key] = depth
depth
以下のように depth をキャッシュしておく。b_call, b_return は method_id などで区別がつけられないのでキャッシュしない。’
def get_depth key
if @depth_map[key]
return @depth_map[key]
end
depth = caller.size
@depth_map[key] = depth
depth
トレースなし | 0.0031299996189773083 | 0.004700999706983566 | 0.0031349998898804188 | 0.0045289997942745686 | 0.0030399998649954796 |
配列2つ | 0.14409800013527274 | 0.149187000002712 | 0.14717700006440282 | 0.14608300011605024 | 0.1501710000447929 |
配列一つ(shift) | 0.14645999995991588 | 0.13693899987265468 | 0.15416699973866343 | 0.15971000026911497 | 0.148286999668926 |
リングバッファ | 0.1528189997188747 | 0.1525459997355938 | 0.15298400027677417 | 0.15116399992257357 | 0.15816699992865324 |
以下のように TracePoint のブロック内の処理を少しずつ追加してベンチマークをとってみる。
トレースなし
ブロックのみ
@tracer = TracePoint.new(:a_call, :a_return, :line){|tp|
}