2009年03月30日
phpを高速化する computed goto
前回 インタプリタ型言語を高速化する computed goto で紹介したcomputed gotoを、「phpでも使えないの?」という声が社内であったので、 php のソースコードを見たところ、特定のビルド手順で php でも computed goto が使えることが判りました。そのビルド手法とベンチマーク結果を紹介しておきます。
php の VM のソースコードは、phpソースパッケージ中の Zend/ というディレクトリの中にあります。zend_vm_で始まる幾つかのファイルのうち、 zend_vm_execute.h というファイルが命令ディスパッチが実装されているファイルで、このファイルは zend_vm_gen.php というスクリプトで生成されています。そして、 zend_vm_gen.php のオプションで、命令ディスパッチの方法を選択できます。(phpのビルドにphpが必要です)
computed goto を使うビルド手順は以下の通りになります。
$ tar xzf php-5.2.x $ cd xzf php-5.2.x/Zend $ php zend_vm_gen.php --with-vm-kind=GOTO $ cd .. $ ./configure --with-zend-vm=GOTO [その他オプション] $ make
Zend/ ディレクトリの中に bench.php というファイルがあったので、これを使って通常の関数ポインタ配列版とcomputed goto版の速度を比較してみました。
# 関数ポインタ配列版. $ ~/local/stow/php-5.2.9-func/bin/php bench.php simple 0.319 simplecall 0.412 simpleucall 0.639 simpleudcall 0.693 mandel 0.991 mandel2 1.311 ackermann(7) 0.767 ary(50000) 0.047 ary2(50000) 0.037 ary3(2000) 0.534 fibo(30) 1.739 hash1(50000) 0.087 hash2(500) 0.098 heapsort(20000) 0.312 matrix(20) 0.257 nestedloop(12) 0.539 sieve(30) 0.232 strcat(200000) 0.034 ------------------------ Total 9.047 # computed goto版 $ ~/local/stow/php-5.2.9-goto/bin/php bench.php simple 0.283 simplecall 0.360 simpleucall 0.584 simpleudcall 0.645 mandel 1.022 mandel2 1.213 ackermann(7) 0.788 ary(50000) 0.046 ary2(50000) 0.036 ary3(2000) 0.485 fibo(30) 1.716 hash1(50000) 0.079 hash2(500) 0.090 heapsort(20000) 0.276 matrix(20) 0.237 nestedloop(12) 0.479 sieve(30) 0.234 strcat(200000) 0.035 ------------------------ Total 8.610
5%くらい速くなっていますね。 Python 3.1 だけじゃなくて php をビルドするときも computed goto を試してみて下さい。
@methane
klab_gijutsu2 at 16:03│Comments(0)│TrackBack(0)