Multi-threaded perl vs. Single-threaded perl

perl5 ithread についての個人的な見解。そして Coro について。(tokuhirom)より

ithreads を有効にしてコンパイルするだけで perl インタープリタの速度が低下する[要出典]

これをちょうど試そうと思っていたところなのだった。ナイスタイミング。

結論からいえば,シングルスレッドなperlはマルチスレッドなperlよりロード時間・実行時間共に10%ほど高速である。

以下詳細を記す。

まず,perlバイナリを2つ用意する。バージョンはパッチなしの5.10.0で,ビルド/実行環境はLinux 2.6.18-92.el5pae, gcc 4.3.2 20081007 (Red Hat 4.3.2-7)である。

sperl (single-threaded perl):

$ ./Configure -des -Doptimize=-O3 -Dprefix=~/sperl \
 -Accflags="-Wall -Wextra -pipe" -Dinc_version_list=none \
 -Dcc=gcc43
$ make test 
$ make install PERLNAME=sperl

mperl (multi-threaded perl):

$ ./Configure -des -Doptimize=-O3 -Dprefix=~/mperl \
-Accflags="-Wall -Wextra -pipe" -Dinc_version_list=none \
-Dcc=gcc43 -Dusethreads
$ make test
$ make install PERLNAME=mperl

その後cpan(1)で適当にモジュールを入れ,いくつかのケースで時間を計ってみた。

Mooseのロード時間

sperl:

$ time sperl -e 'require Moose'

real    0m0.206s
user    0m0.179s
sys     0m0.016s

mperl:

$ time mperl -e 'require Moose'

real    0m0.230s
user    0m0.205s
sys     0m0.013s

何度かやってみたが大体このような感じで,約10%ほどsperlが速い。

Perl::Criticのロード時間

sperl:

$ time sperl -e 'require Perl::Critic'

real    0m0.440s
user    0m0.356s
sys     0m0.043s

mperl:

$ time mperl -e 'require Perl::Critic'

real    0m0.495s
user    0m0.403s
sys     0m0.042s

やはり10%ほどsperlが速い。

perlcritic(1)の実行時間

Perlで書かれたコマンドの中では屈指の遅さを誇るperlcritic(1)にpsed(1)*1を解析させた。
sperl:

$ time sperl -S perlcritic `which psed` >/dev/null

real    0m1.981s
user    0m1.868s
sys     0m0.046s

mperl:

$ time mperl -S perlcritic `which psed` >/dev/null

real    0m2.180s
user    0m2.081s
sys     0m0.057s

これも10%ほどsperlが速い。

シングルスレッドなperlを使うだけで10%高速になるなら,これは考慮に値する。

*1:Perlディストリビューションに含まれているsed(1)クローン