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