Quantcast
Channel: PHP8タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 546

PHP8.0のJITコンパイラはPHP7.4+FFI(Go)にどこまで近づけるか

$
0
0

はじめに

以前このような記事を投稿しました

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=128M

JITコンパイラで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 JIT1.9577729701996 秒9.5034010410309 秒

良い結果が出たのではないでしょうか

気になる点として、PHP8.0は何もしなくてもPHP7.4より速くなると言った内容の記事もありましたが、私の環境ではJITコンパイラ無効時はPHP7.4より遅くなっているようです
また、FFI利用時は誤差レベルかもしれませんがJITコンパイラの設定に関係なく、少し遅くなっているようです

とは言ってもJITコンパイラを有効にした場合の結果はとても優秀で、FFIには追いつかずともかなり大きな速度向上が見込めるのではないでしょうか


Viewing all articles
Browse latest Browse all 546

Trending Articles