5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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メソッドを定義して呼び出した場合は更に実行に時間がかかりました。
おそらく例外処理の中でスタックトレースを作成する処理があるので、クラス化する分その処理が増えて実行に時間がかかるのだと思われます。

5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?