PHP 5.4 のアップデートリストには、「Zend エンジンのパフォーマンスを向上させ、メモリ使用量を削減しました。
」という一文があります。では、どのように改善されているのでしょうか?
不要なハッシュテーブルを避ける
PHP では、クラス属性/静的属性/定数はすべて Hashtable に格納されることがわかっています。以前は、クラスが属性/静的属性/定数を宣言していなくても、Zend エンジンがそれらに Hashtable を割り当てていました。
現在、このプロセスは最適化されており、要素がある場合にのみハッシュテーブルが割り当てられます。
これにより、一部の emalloc/efree 操作が回避され、メモリ使用量がいくらか削減されます。四次最適化
PHP では、実際に実行されるのはオペコードです。1 つのオペコードには、result、left、right の 3 つの固定オペランドが含まれています。以前は、When there など、まったく使用されなかった場合でも、これら 3 つのオペランドのそれぞれに zval が含まれていました。右側のオペランドがない場合は、zval が右側のオペランドに割り当てられます。
現在、すべてのオペランドには zval が直接含まれなくなりますが、各 op 配列にはリテラル テーブルが含まれます。
また、znode もそれに応じて調整されました。
このようにして、以前の (32 ビット オペレーティング システム) オペコードが占有していたメモリ使用量も 72 バイトから現在の 28 バイトに削減できます。
さらに、文字列の場合、リテラル テーブルには文字列の事前に計算されたハッシュ値も保存され、実行時の複数の計算が回避されます。
リテラル文字列
C 言語と同様に、コード内のリテラル文字列は、実行期間全体を通じて固定セグメント (データ セグメント) に保存され、これらの文字列は定数文字列であり、変更したり解放したりすることはできません。
PHP もこの考え方を利用し、内部文字列の概念を提案しています。PHP コード内のリテラル文字列は一度割り当てられ、実行期間全体にわたって変更することはできません。
PHP が copy_zval や free zval などの操作を実行するとき、不必要な free や copy を避けるために内部文字列を特別に処理します。
このようにして、これらのリテラル文字列のハッシュ値が事前に計算され、ハッシュテーブルでの文字列比較 == とハッシュ計算に、この事前に計算されたハッシュ値が直接使用されるため、パフォーマンスが向上します。 🎜>
その他もちろん、オペコードの最適化や不要なオペコードの削減など、最適化のポイントはたくさんありますので、ここでは詳しく説明しません
比較
以下は、PHP 開発チームの内部テストから得られたデータの一部です:
ネイティブ PHP、オペコード キャッシュなし:
php-trunkpatchedinprovement
bench.php (秒)4.313.4919%
micro_bench.php (秒)19.7814.6326%
いくつかの実際的なアプリケーション:
php-trunkpathcedimprovement
ブログ (要求/秒)59.366.212%
drupal (要求/秒)1073.91084.81%
fw (要求/秒)105.3111.86%
こんにちは (要求/秒)5362.55351.40%
qdig (要求/秒)243.4253.74%
typo3 (要求/秒)355.3382.68%
wordpress (要求/秒)101.8108.57%
xoops (要求/秒)70.378.512%
スクラム (要求/秒)86.5104.220%
これらのデータから判断すると、パフォーマンスの向上は依然として明らかです。