例外処理は好きかーーーーーー!?
gemなどのライブラリを作っているとユーザとの対話的な役割として例外を使ったりするので調べてたら例外は重いなどの情報が出てきたのでここに記るします。
四の五の言わずにコードで計測してみます。
計測結果
if_pattern.rb
get_value = -> val { val.odd? ? val : nil}
def judge val
if val.nil?
else
end
end
require 'benchmark'
result = Benchmark.realtime do |b|
(1..100000).each do |i|
judge get_value.(i)
end
end
p "#{result}秒"
excaption_pattern.rb
get_value = -> val { val.odd? ? val : nil}
def judge val
if val.nil?
raise StandardExcaption
end
rescue
end
require 'benchmark'
result = Benchmark.realtime do |b|
(1..100000).each do |i|
judge get_value.(i)
end
end
p "#{result}秒"
結論
単純なifに比べて20倍くらい実行にかかっている。
まあ例外クラス作ったりしてるから当然なんだろうけれど、これで条件分岐のために例外投げてごにょごにょしようとは思わなくなりました。
あと今回の例ではlambdaを使ってますが、これをクラス化してget_valueメソッドを定義して呼び出した場合は更に実行に時間がかかりました。
おそらく例外処理の中でスタックトレースを作成する処理があるので、クラス化する分その処理が増えて実行に時間がかかるのだと思われます。