[Rails]fast_blankのススメ

実はRailsのBlank? メソッドって遅いって知ってました?


環境: Rails 4.0.2, ruby 2.0.0p353

実際に試してみましょう!
以下のようなRakeタスクを作ります。(rails g task bench)


namespace :bench do
task :blank do |args|
n = ENV['N'].to_i
v = nil
Benchmark.bm do |x|
x.report('1: ') do
n.times { v.blank? }
end
x.report('2: ') do
n.times { v.blank? }
end
x.report('3: ') do
n.times { v.blank? }
end
end
end
end

vの値を色々と変更して,実行してみます


vが nilの場合


$ rake bench:blank N=1000000
user system total real
1: 0.100000 0.000000 0.100000 ( 0.098919)
2: 0.120000 0.000000 0.120000 ( 0.118264)
3: 0.100000 0.000000 0.100000 ( 0.102616)

vが {} の場合


$ rake bench:blank N=1000000
user system total real
1: 0.080000 0.000000 0.080000 ( 0.083583)
2: 0.090000 0.000000 0.090000 ( 0.090023)
3: 0.090000 0.000000 0.090000 ( 0.085476)

vが [] の場合


$ rake bench:blank N=1000000
user system total real
1: 0.080000 0.000000 0.080000 ( 0.081568)
2: 0.090000 0.000000 0.090000 ( 0.082006)
3: 0.080000 0.000000 0.080000 ( 0.087567)

vが ''(空文字) の場合


$ rake bench:blank N=1000000
user system total real
1: 0.790000 0.010000 0.800000 ( 0.793234)
2: 0.740000 0.000000 0.740000 ( 0.734929)
3: 0.710000 0.000000 0.710000 ( 0.718916)

vが ' '(半角スペース一文字)の場合


$ rake bench:blank N=1000000
user system total real
1: 0.660000 0.010000 0.670000 ( 0.660808)
2: 0.640000 0.000000 0.640000 ( 0.651678)
3: 0.660000 0.000000 0.660000 ( 0.659291)

Stringオブジェクトに対して blankを実行すると遅くなるみたいですね


fast_blankをいれてみる


fast_blankというgemを導入することでblank? メソッドの処理を高速化することができます。


Gemファイルに以下を追加し、bundle installを実行します。


gem 'fast_blank'

vが ''(空文字) の場合


$ rake bench:blank N=1000000
user system total real
1: 0.090000 0.000000 0.090000 ( 0.096981)
2: 0.090000 0.000000 0.090000 ( 0.086419)
3: 0.080000 0.000000 0.080000 ( 0.086382)

8倍!!になります!


vが ' '(半角スペース一文字) の場合


$ rake bench:blank N=1000000
user system total real
1: 0.110000 0.000000 0.110000 ( 0.112875)
2: 0.110000 0.000000 0.110000 ( 0.109189)
3: 0.110000 0.000000 0.110000 ( 0.108664)

こちらは 6倍早くなりました!

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。