Multi-threaded perl vs. Single-threaded perl
perl5 ithread についての個人的な見解。そして Coro について。(tokuhirom)より
これをちょうど試そうと思っていたところなのだった。ナイスタイミング。
結論からいえば,シングルスレッドな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)クローン