ホームページ  >  記事  >  php教程  >  php5.4 Zendエンジンの最適化

php5.4 Zendエンジンの最適化

WBOY
WBOYオリジナル
2016-06-21 08:52:56946ブラウズ

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%

これらのデータから判断すると、パフォーマンスの向上は依然として明らかです。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。