以下のように TracePoint のブロック内の処理を少しずつ追加してベンチマークをとってみる。
-
トレースなし
-
ブロックのみ
@tracer = TracePoint.new(:a_call, :a_return, :line){|tp|
}
以下のように TracePoint のブロック内の処理を少しずつ追加してベンチマークをとってみる。
トレースなし
ブロックのみ
@tracer = TracePoint.new(:a_call, :a_return, :line){|tp|
}
トレースなし | 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 |
以下のように 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
@tracer = TracePoint.new(:a_call, :a_return, :line){|tp|
end
@tracer = TracePoint.new(:a_call, :a_return, :line){|tp|
秒 | |||||
---|---|---|---|---|---|
トレースなし | 0.006363000255078077 | 0.006033000070601702 | 0.004674999974668026 | 0.007385000120848417 | 0.006134000141173601 |
配列2つ | 1.2077299999073148 | 1.2094470001757145 | 1.2031790004111826 | 1.2191599998623133 | 1.1907759997993708 |
配列一つ(shift) | 1.1787890000268817 | 1.2063179998658597 | 1.194932000245899 | 1.1878820001147687 | 1.1984939998947084 |
リングバッファ | 1.208700000308454 | 1.210185999982059 | 1.2016769996844232 | 1.2195199998095632 | 1.2273840000852942 |
require 'webrick' | |
require 'json' | |
binding = TOPLEVEL_BINDING.dup | |
srv = WEBrick::HTTPServer.new({:BindAddress => '127.0.0.1', | |
:Port => 8080}) | |
srv.mount_proc('/') {|req, res| | |
body = JSON.parse req.body | |
expr = body['expression'] | |
result = binding.eval(expr) | |
puts result |
# pattern1 | |
def to_rdbg_mimebundle kw | |
format = { | |
"application/rdbg+json" => json | |
} | |
format, {} | |
end | |
# pattern2 | |
def to_rdbg_mimebundle kw |
require 'json' | |
module REXMLInspector | |
def to_rdbg_mimebundle kw | |
json = JSON.generate { | |
type: :tree, | |
data: get_tree(self) | |
} | |
[ | |
{ | |
"application/json" => json |
module REXMLInspector | |
def to_obj_inspector kw | |
[ | |
{ | |
type: :tree, | |
data: get_tree(self) | |
} | |
] | |
end |
前後期で一貫して取り組んだことは Chrome でのデバッグ機能の実装を通した利用体験・フレームワーク開発による開発効率の改善である。
前期では、Chrome を使ったデバッグを問題なくできるところを目指し、外部ツール(Chrome、VSCode) とのインターフェースをテストするフレームワーク導入に向けて実装していった。後期では、Chrome DevTools の強みを活かしたリッチな体験、 プロトタイプを通して得られた知見をもとによりよいフレームワーク開発による開発効率の向上を目標に取り組んだ。