require高速化:基準となるベンチマーク


require

ベンチマークを行った環境


WindowsMacLate 2008 MacBook
CPU 2.4GHz Intel Core 2 Duo
メモリ 4GB 1067MHz DDR3
ハードディスク TOSHIBA MK3253GSX 320GB 5400RPM 8MB Buffer

WindowsBootCampWindowsXP Home SP3NTFSMacSnow Leopard HFS+

ruby1.8.7p2491.9.1p378Windows使mswin32(VC6)MacMacPorts1.8.7p249Snow Leopard1.8.7p173使

WindowsMacruby12rubyrequire

各ライブラリはどのくらいの数のファイルをrequireしているのか?


requireruby調調調
rubyWindowsMacWindows調

調使requirefalse
alias :require_original :require

$require_success_files = []

def require(feature)
    ret = require_original(feature)
    if ret
        $require_success_files << feature
    end
    ret
end

require 'rexml/document'  # この行を調べたいライブラリに変更p$require_success_files.size

rubygemsrubygemsrequirerequire 'rubygems'

(gem)rubygems
ライブラリ名 1.8.7で読み込んだファイル数 1.9.1で読み込んだファイル数
rexml/document 35 35
rubygems 35 0
sqlite3-ruby(gem) 11 12
oauth(gem) 60 59
twitter(gem) 125 135

1.8.71.9.1rubygems1.9.1rubygems0twitter gem100

各ライブラリをrequireするのにどのくらい時間がかかるか?

それでは次に、本題であるrequireの時間を計ってみます。

モジュール名 Windows 1.8.7 Mac 1.8.7 Windows 1.9.1 Mac 1.9.1
rexml/document 0.140625 0.029783 0.281250 0.058118
rubygems 0.171875 0.092663 0.000000 0.000113
sqlite3-ruby(gem) 0.031250 0.034831 0.187500 0.031970
oauth(gem) 0.187500 0.060517 0.406250 0.088203
twitter(gem) 0.546875 0.158961 0.921875 0.244374

1.8.7WindowsMac41.9.11.8.7VM

1.8.71.9.1WindowsMac12Windows6調

requireの個別のプロセスを計測する


requireWindowsrequireWindows調

require


(一)$LOAD_PATH.rb.so調

(二)

(三)









OS


requiregithub

http://github.com/ashel/ruby-require-benchmark

使git clone
% ruby create_testdata.rb
% ruby run_benchmarks.rb

11benchmark_*run_benchmarks.rbrun_benchmarks.rbruby1.9ruby1.9
% ruby1.9 create_testdata.rb
% ruby1.9 run_benchmarks.rb ruby1.9

OK




require_empty

(magic comment)100require1require

require_class

require_empty1100requireequire_empty

require_class_onefile

require_classrequire1001requirerequire_class

read_empty

require_emptyrequirereadrequire

read_class

require_classrequireread

read_class_onefile

require_class_onefilerequireread

read_class_onefile_binmode

read_class_onefileMacWindows

read_class_onefile_windows31j

read_class_onefileWindows-31Jruby1.9MacWindows

file_exist

調(File.exist?)調100File.exist?20

compile_class_onefile

ruby1.9require_class_onefile使使RubyVM::InstructionSequence.compileOS

file_exist_load_path

$LOAD_PATH(require)100$LOAD_PATH



テスト内容 Win 1.8.7 Mac 1.8.7 Win 1.9.1 Mac 1.9.1
require_empty 0.156250 0.015123 0.234375 0.041115
require_class 0.218750 0.049868 0.406250 0.095429
require_class_onefile 0.062500 0.033033 0.171875 0.054280
read_empty 0.015625 0.002333 0.015625 0.003199
read_class 0.015625 0.002755 0.109375 0.003580
read_class_onefile 0.000000 0.000480 0.093750 0.000375
read_class_onefile_binmode 0.000000 0.000468 0.000000 0.000364
read_class_onefile_windows31j 0.093750 0.001068
file_exist 0.093750 0.012620 0.062500 0.014248
compile_class_onefile 0.062500 0.045660
file_exist_load_path 0.031250 0.005939 0.078125 0.019137

1.8.7WindowsMacrequire10require_class_onefile2require_classrequireWindowsMac4require

require_emptyread_emptyWindowsMac1file_existfile_exist_load_pathrequire

1.9.1Windows1.8.7read_emptyread_class1.9.1read_classread_class_onefileWindows1.9.1Mac

read_class_onefile_binmodeWindows1.8.71.9.1Windows

WindowsWindows-31Jread_class_onefile_windows31jMacWindows-31JWindows

compile_class_onefileMac1.37VC6gcc





1.8.7WindowsrequireMac24

Windows(File.exist?)(open,read,close)

Windows1.9.1

1.9VMWindowsMac1.4

今後のこと


RubyVMrequirerequirerequirerequirerequire