スクリプト言語の起動時間を調べてみた
実行してみると分かるが、Rubinius の起動は実に遅い。どのくらい遅いかというと、間違って Java を起動したんじゃないかと思うほど遅い。
あまりに遅いので、Ruby と Rubinius の起動時間を調べてみた。ついでに、他のスクリプト言語の起動時間も計測してみた。
起動時間を計測するスクリプトはこちら。
## usage: ruby -s invoke.rb [-N=1000] [command] require 'benchmark' $N ||= 100 command = ARGV[0] if command commands = [command] else commands = [ 'ruby -e nil', 'ruby -e "nil"', 'rbx -e nil', 'rbx -e "nil"', 'perl -e 0', 'perl -e "0"', 'python -c None', 'python -c "None"', 'php -r null\;', 'php -r "null;"', 'js -e null', 'js -e "null"', 'lua -e a=1', 'lua -e "a=1"', ] end Benchmark.bm(30) do |job| commands.each do |command| title = command job.report(title) do ($N.to_i/10).times do system command system command system command system command system command system command system command system command system command system command end end end end
バージョンは次の通り。このうち perl だけは MacPorts、他は自分でコンパイルしたもの。
$ ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1] $ rbx -v rubinius 0.8.0 (ruby 1.8.6 compatible) (dfdf90968) (02/11/2008) [i686-apple-darwin8.11.1] $ python -V Python 2.5.1 $ perl -v This is perl, v5.8.8 built for darwin-2level Copyright 1987-2006, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. $ js -v JavaScript-C 1.6 pre-release 1 2006-04-04 (OSSP js 1.6.20070208) usage: js [-PswWxC] [-b branchlimit] [-c stackchunksize] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...] $ lua -v Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio
各コマンドを 100 回起動したときの計測結果はこちら。
$ ruby -s invoke.rb -N=100 user system total real ruby -e nil 0.010000 0.080000 1.490000 ( 1.614998) ruby -e "nil" 0.010000 0.080000 2.100000 ( 2.197384) rbx -e nil 0.010000 0.080000 68.600000 ( 70.230174) rbx -e "nil" 0.020000 0.080000 69.740000 ( 71.517219) perl -e 0 0.010000 0.080000 0.850000 ( 0.966201) perl -e "0" 0.010000 0.080000 1.420000 ( 1.561597) python -c None 0.010000 0.090000 10.190000 ( 10.439487) python -c "None" 0.020000 0.080000 10.820000 ( 11.190970) php -r null\; 0.010000 0.090000 3.610000 ( 3.862456) php -r "null;" 0.010000 0.080000 3.600000 ( 3.842694) js -e null 0.010000 0.080000 0.970000 ( 1.205289) js -e "null" 0.020000 0.090000 1.500000 ( 1.595056) lua -e a=1 0.010000 0.080000 0.700000 ( 0.799047) lua -e "a=1" 0.010000 0.080000 1.240000 ( 1.424797)
注意:
同じコマンドを 2 つ計測しているのは、shell の起動にかかる時間を調べるため。Ruby の system() 関数は、たとえば ruby -e nil は shell を起動しないが、ruby -e "nil" は起動する。そのため、両者の差である約 0.6 秒が、shell 起動にかかった時間である。
また user time と system time はほとんど 0 に近いのに、total time は時間がかかっているのは、Ruby の benchmark.rb では child process の時間が無視されているから。
考察:
- Rubinius (rbx) 遅すぎだろ。こりゃ CGI での利用は無理だな。
- Python も遅い。CGI には向かない。しかし Python はライブラリを事前にコンパイルすることができるので、ライブラリの読み込みは他の言語よりも速い。もし多くのライブラリを読み込むことになると、他との差はかなり縮まるはず。
- PHP は思ったより速くなかった。バイナリサイズが大きいのが原因かも。しかし HTTP Request の解析やセッション機能など、他の言語ならライブラリを読み込まないと使えない機能が PHP では最初から使えるので、そういったライブラリを読み込まなくて済む分、実質的には速いと思われる。
- Lua と JS (spidermonkey) が速いのは、主にバイナリサイズが小さいためと思われる。しかしバイナリサイズでは JS (31,592 byte) より Lua (154,492 byte) のほうが大きいのに、起動時間は逆に Lua のほうが速い (動作速度でも JS より Lua のほうが速いことが知られている)。
- Ruby は思ったより速かった。しかし Ruby はライブラリの読み込みに時間がかかるので (特に cgi.rb)、素直には喜べない。
- Perl は起動が速い。バイナリサイズが 1,103,676 byte あるのに JS より速いのはすごい。これが噂の dump 機能のおかげか?