本を読む

読書やコンピュータなどに関するメモ

RubyでLoggerのブロック引数の効率を試す

 Rubyで標準のLoggerを使ってlogger.debug(expr)とかやると、デバッグレベルじゃないときにもexprは評価されてしまいます。ruby-profで見てみて、思ったより実行していることを知って、ちょっとオーバーヘッドが気になったり。観測問題ってやつですか。

 Rubyはマクロないからなぁと誤解してましたが、ドキュメントを読んだらLogger#debugとかではブロック引数で指定できると書いてあるじゃないですか。RTFM >おいら

 ただ、ブロック引数のオーバーヘッドは気になります。そこで、ベンチマークを取ってみました。結論は、実行時間(かかる順)ベースで以下のとおり。

Hashの式展開 >> ブロック引数 > Fixnumの式展開 > Stringの式展開

$ cat bench.rb
require 'benchmark'
require 'logger'

logger = Logger.new(STDOUT)
logger.level = Logger::ERROR

puts Benchmark::CAPTION
puts Benchmark.measure { 100000.times { logger.debug "#{'3'}" } }
puts Benchmark.measure { 100000.times { logger.debug "#{3}" } }
puts Benchmark.measure { 100000.times { logger.debug "#{{:a => 3}}" } }
puts Benchmark.measure { 100000.times { logger.debug { "#{{:a => 3}}" } } }
$ ruby --version
ruby 1.9.1p429 (2010-07-02 revision 28523) [i686-linux]
$ ruby ./bench.rb
      user     system      total        real
  0.130000   0.000000   0.130000 (  0.127763)
  0.170000   0.010000   0.180000 (  0.182469)
  0.630000   0.010000   0.640000 (  0.620975)
  0.180000   0.010000   0.190000 (  0.198962)

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/792-1cf56539

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad