はじめに
以前このような記事を投稿しました
PHP7.4の新機能、FFIでGoを使ってみた
https://qiita.com/i4M1k0SU/items/7c0db12e047e0fbf7550
この記事ではPHP7.4での新機能、FFIからGoで実装した共有ライブラリを利用し、PHPだけでの処理の20倍以上ものパフォーマンスを出すことができました
今回はPHP8.0に追加されたJITコンパイラ機能を利用し、この結果にどこまで近づけるかを検証します
PHP8.0の導入
PHP8.0はこの記事を投稿した段階ではまだ正式なリリースがされていません
今回はmacを利用しているのですが、DockerやVMは使わずhomebrewからネイティブ環境に導入することにしました
https://github.com/shivammathur/homebrew-php
brew update
brew tap shivammathur/php
brew install shivammathur/php/php@8.0
brew link--overwrite--force php@8.0
JITコンパイラの有効化
php.iniを書き換えます
/usr/local/etc/php/8.0/php.ini
opcache.enable=1opcache.enable_cli=1# 以下は追記する必要があります
opcache.jit=1235opcache.jit_buffer_size=128MJITコンパイラでPHPはどれだけ速くなるか
以前書いた記事と全く同じ検証用コードです
ついでにPHP8.0+FFIも検証します
constCOUNT=40;$ffi=FFI::cdef('extern unsigned int calcFibonacci(unsigned int p0);','[PATH]/fibonacci.dylib');// 比較対象のPHP実装サンプルfunctioncalcFibonacci(int$i):int{if($i<2){return$i;}returncalcFibonacci($i-1)+calcFibonacci($i-2);}// Go(FFI)実装の実行速度計測$startTime=microtime(true);for($i=1;$i<=COUNT;$i++){$ffi->calcFibonacci($i);}$time=microtime(true)-$startTime;echo"Go(FFI): {$time}秒\n";// PHP実装の実行速度計測$startTime=microtime(true);for($i=1;$i<=COUNT;$i++){calcFibonacci($i);}$time=microtime(true)-$startTime;echo"PHP: {$time}秒\n";結果
| FFI(Go) | PHP | |
|---|---|---|
| PHP7.4 (前回の結果) | 1.5760109424591 秒 | 33.616943836212 秒 |
| PHP8.0 without JIT (and opcache) | 1.8609459400177 秒 | 42.444294929504 秒 |
| PHP8.0 with JIT | 1.9577729701996 秒 | 9.5034010410309 秒 |
良い結果が出たのではないでしょうか
気になる点として、PHP8.0は何もしなくてもPHP7.4より速くなると言った内容の記事もありましたが、私の環境ではJITコンパイラ無効時はPHP7.4より遅くなっているようです
また、FFI利用時は誤差レベルかもしれませんがJITコンパイラの設定に関係なく、少し遅くなっているようです
とは言ってもJITコンパイラを有効にした場合の結果はとても優秀で、FFIには追いつかずともかなり大きな速度向上が見込めるのではないでしょうか