板垣です。

前々から気になっていた事をポストします。Windows上でのRubyの速度の件です。
速度といっても、通常のマイクロベンチマークではなく、ファイルIOに限った問題です。

仕事上、Windows以外にUbuntu LinuxやMac OS Xも使っているのですが、Railsで
の開発で、テストサーバやコンソールの起動、テストの実行などのスピードが、
Windowsとそれ以外で大きく異なっているのに気がついていました。

インタプリタ自体の動作の差はそれほどないのに、上記のような状況で遅くなる
のはファイルIOのせいだろうと当たりを付けて、下記のようなベンチマークを行って
見ました。

遅くなる状況を考慮して、小さいサイズのファイルを多数作成し、それらを読み込んで
連結出力するようなベンチマークです。

自宅ではメインマシンがMacBookであるため、古いノートでの結果です。

require "benchmark"

File.open(__FILE__,'r') do |f|
  $testdata = f.read
end

Benchmark.bm(7,">total:",">avg:") do |bm|
  testresults = []
  10.times do |i|
    testresults << bm.report("#{i + 1}:") do
                    Dir.mkdir("testdir") unless File.exists?("testdir")
                    Dir.chdir("testdir") do
                      1000.times do |i|
                        File.open("testfile#{i}.txt","w") do |f|
                          f.write $testdata
                        end
                      end
                      File.open("join.txt","w") do |of|
                        Dir.glob("testfile*.txt") do |fn|
                          File.open(fn) do |in_file|
                            of.write in_file.read
                          end
                         File.unlink(fn)
                        end
                      end
                      File.unlink("join.txt")
                    end
                  end
  end
  testtotal = testresults.inject {|total,test| total += test}
  [testtotal, testtotal / 10]
end

テスト環境

ハード

NEC LaVie M LM500/4
CPU Mobile Pentium  III 1133MHz
Memory 512MB

Windows XP Pro SP3(ウイルス対策オフ)
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

             user     system      total        real
1:       0.380000   2.123000   2.503000 (  3.725000)
2:       0.531000   2.033000   2.564000 (  3.145000)
3:       0.391000   2.183000   2.574000 (  3.114000)
4:       0.440000   2.083000   2.523000 (  3.095000)
5:       0.381000   2.233000   2.614000 (  3.154000)
6:       0.511000   1.913000   2.424000 (  3.205000)
7:       0.480000   2.103000   2.583000 (  3.124000)
8:       0.371000   2.223000   2.594000 (  4.016000)
9:       0.320000   2.173000   2.493000 (  3.095000)
10:      0.451000   2.023000   2.474000 (  3.144000)
>total:  4.256000  21.090000  25.346000 ( 32.817000)
>avg:    0.425600   2.109000   2.534600 (  3.281700)

Ubuntu Linux Desktop 7.04
ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]

             user     system      total        real
1:       0.010000   0.010000   0.020000 (  0.273358)
2:       0.010000   0.020000   0.030000 (  0.251698)
3:       0.020000   0.030000   0.050000 (  0.284182)
4:       0.000000   0.040000   0.040000 (  0.290983)
5:       0.020000   0.020000   0.040000 (  0.307011)
6:       0.020000   0.030000   0.050000 (  0.303224)
7:       0.020000   0.030000   0.050000 (  0.315228)
8:       0.100000   0.160000   0.260000 (  0.276737)
9:       0.080000   0.170000   0.250000 (  0.259840)
10:      0.110000   0.180000   0.290000 (  0.288993)
>total:  0.390000   0.690000   1.080000 (  2.851254)
>avg:    0.039000   0.069000   0.108000 (  0.285125)

これで解る通り10倍以上の差が出ています。
ちなみにWindowsでウイルス対策(Norton AntiVirus Game Edition 2009)を
有効にした場合、Permissionエラーが発生して正常に計測できませんでした。

WindowsのファイルシステムNTFSの問題かとも思い別のマシンでFAT32との
比較もしてみましたが差はありませんでした。

-- 
---------------------
いたさん
http://rails.to/