MIME型判別ライブラリの速度測定その2とメモリ使用量

以前「RubyにおけるMIME型判別ライブラリの比較」というものを書きましたが、RamazeさんにもMIME型判別のモジュール(Ramaze::Tool::MIME)がありました(ただしMongrel由来のもの)。

じゃあせっかくだから、速度を測っておきましょう。以前書いたものにちょっとだけ追加して。

require 'benchmark'

require 'rubygems'
require 'mime/types'
M1 = MIME
require 'shared-mime-info'
M2 = MIME
require 'ramaze'
M3 = Ramaze::Tool::MIME

$path = "start.rb"
$n = 1000

Benchmark.bmbm do |job|
   job.report("mime/types") {$n.times do; M1::Types.type_for($path); end}
   job.report("shared-mime-info#check") {$n.times do; M2.check($path); end}
   job.report("shared-mime-info#check_globs") {$n.times do; M2.check_globs($path); end}
   job.report("shared-mime-info#check_magics") {$n.times do; M2.check_magics($path); end}
   job.report("Ramaze::Tool::MIME") {$n.times do; M3.type_for($path); end}
end

結果は次のようになりました。

Rehearsal -----------------------------------------------------------------
mime/types                      0.010000   0.000000   0.010000 (  0.005872)
shared-mime-info#check          1.380000   0.160000   1.540000 (  1.635830)
shared-mime-info#check_globs    1.380000   0.140000   1.520000 (  1.600142)
shared-mime-info#check_magics   3.960000   0.520000   4.480000 (  4.738064)
Ramaze::Tool::MIME              0.010000   0.000000   0.010000 (  0.004310)
-------------------------------------------------------- total: 7.560000sec

                                    user     system      total        real
mime/types                      0.010000   0.000000   0.010000 (  0.007079)
shared-mime-info#check          1.420000   0.160000   1.580000 (  1.624755)
shared-mime-info#check_globs    1.370000   0.200000   1.570000 (  1.580417)
shared-mime-info#check_magics   3.980000   0.480000   4.460000 (  5.042994)
Ramaze::Tool::MIME              0.000000   0.000000   0.000000 (  0.004912)

というわけで、mime/types と Ramaze::Tool::MIMEに特に大きな差はないようです。

(追記:以下の記述は嘘であることが分かりました、ごめんなさい)

次に、前回は速度を測っただけなので「メモリ使用量はどうなの?」と気になりだしましたので、これもせっかくだから測ってみます。残念ながらRamaze::Tool::MIMEは単体で測るのが困難なので除外します。よって mime/types, shared-mime-info の比較となります。

(この結果は不正確というか間違っています!ご注意下さい)

コード(ruby1.8.6) VSZ RSS
ruby -rubygems -e sleep 100 4176 2760
ruby -rubygems -e require 'mime/types'; sleep 100 12820 11496
ruby -rubygems -e require 'shared-mime-info'; sleep 100 13620 12256

mime/types, shared-mime-info共に、とっても富豪!もう少しメモリに優しいライブラリが必要かも知れません。

追記

こんなにメモリ使うわけないじゃん!と思ってよくよく調べてみたら、この結果は不正確であることが分かりました。ごめんなさい。というのもruby1.8系ではrubygemsはとんでもない程メモリを喰う場合があるからです。1.8系では require した瞬間 Gem.searcher にgemの全てのパスを展開します(詳しくは rubygems/gem_path_searcher.rb をご覧下さい)。つまり多くのgemをインストールしている人はそれだけメモリを消費してしまうことになります。これはとても非効率なのでruby1.9で改善されています(この詳細は gem_prelude.rb をご覧下さい)。

というわけで、早い話がruby1.9で計測するか、またはrubygemsを使わないで計測しないと、全くどうしようもないわけです。以下に再計測したものを掲載しておきます。これは rubygems を使わないで測定してみました。

コード(ruby1.8.6) VSZ RSS
ruby -e sleep 100 3280 1544
ruby -e require 'mime/types'; sleep 100 4424 2896
ruby -e require 'shared-mime-info'; sleep 100 5728 4284

というわけで合理的なサイズになりました。間違ったことを書いてしまいまして誠に申し訳ありませんでした。気をつけないとなぁ。