スクリプト言語の起動時間を調べてみた

実行してみると分かるが、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 機能のおかげか?