Help us understand the problem. What is going on with this article?

rubyの例外処理が遅かった?はなし

More than 3 years have passed since last update.

例外処理は好きかーーーーーー!?

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}秒"

スクリーンショット 2016-11-01 15.37.49.png

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}秒"

スクリーンショット 2016-11-01 15.39.25.png

結論

単純なifに比べて20倍くらい実行にかかっている。
まあ例外クラス作ったりしてるから当然なんだろうけれど、これで条件分岐のために例外投げてごにょごにょしようとは思わなくなりました。
あと今回の例ではlambdaを使ってますが、これをクラス化してget_valueメソッドを定義して呼び出した場合は更に実行に時間がかかりました。
おそらく例外処理の中でスタックトレースを作成する処理があるので、クラス化する分その処理が増えて実行に時間がかかるのだと思われます。

kkyouhei
アドネットワークとかアプリとかEC
basicinc
マーケティングとテクノロジーで社会のあらゆる問題を解決する集団
https://tech.basicinc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away