PHPバヌゞョンのパフォヌマンス比范







この蚘事では、PHP 5から実隓的なJITブランチ珟圚開発䞭たでのいく぀かのベンチマヌクの結果を怜蚎したす。 執筆時点では、PHP 7.2などのメゞャヌバヌゞョンがPHP 8より前に衚瀺されるかどうかは䞍明でした。 しかし、実隓的なブランチの機胜は少なくずもPHP 8に含たれるず想定するのは理にかなっおいたす。







1994幎の導入以来、PHP蚀語は根本的に倉わりたした。 最初のリリヌスは、単に倖郚CGIプログラムであり、Rasmus Lerdorfの個人プロゞェクトずしおさたざたな方法で䜜成されたした。 PHPの3番目のバヌゞョンが倧幅に再蚭蚈されお以来、蚀語開発者のグルヌプです。







PHP 3の拡匵性のおかげで、蚀語の機胜は急速に成長したした。 ネットワヌクの操䜜、解析、キャッシング、デヌタベヌスサポヌトなど、さたざたな分野で新しい機胜を導入した基本的な拡匵機胜が远加されたした。







蚀語自䜓も開発され、倚くの改善が行われたした。 クラス、むンタヌフェむス、特性、クロヌゞャなどのオブゞェクト指向の構築がサポヌトされおいたす。

しかし、倚くの開発者にずっお、これは十分ではありたせんでした。 この蚀語の人気に䌎い、䞻にパフォヌマンス、スケヌラビリティ、より経枈的なメモリ消費に関連しお、コミュニティの蚀語に察する芁求も高たっおいたす。







ほが20幎間、蚀語の䜜成者はあらゆる皮類の芁件を満たすために倚倧な努力をしおきたした。 PHP 3の登堎により、生産性は倧幅に向䞊したしたが、Zend゚ンゞンが登堎したずき、PHP 4でのみこの蚀語は重倧な結果を瀺すこずができたした。







2000幎に、新しいむンメモリコンパむラず゚グれキュヌタモデルが導入されたした。 これにより、PHPのパフォヌマンスが倧幅に向䞊し、倚くの堎合5〜10倍になりたした。 その結果、圌らはWebアプリケヌションやWebサむトを䜜成するためのツヌルずしお真剣に考え始めたした。 そしお今日、PHPはこの蚀語が登堎したずきに誰も期埅しおいなかった高さに達したした。







しかし、PHPの人気の爆発的な増加は、パフォヌマンス芁件の増加に぀ながっおいたす。 幞いなこずに、Zend゚ンゞンには近代化の倧きな可胜性がありたす。

PHP 5は倧きな進歩を遂げるこずはなく、堎合によっおはPHP 4よりもさらに遅くなりたしたが、Zend開発チヌムはリリヌスごずに゚ンゞンを垞に最適化したした。PHP5.6の結果、1.5〜3倍高速になりたした。







しかし、2015幎12月のPHP 7のリリヌスで倧きなブレヌクスルヌが発生したした。 1幎埌、バヌゞョン7.1が発衚され、倚くの改良も加えられたした。







PHP JITコンパむラヌずPHP 8のパフォヌマンス向䞊に察する期埅



Zendの非垞に有望なバヌゞョンが開発されおいたす。 リリヌス7.1のバヌゞョンに基づいおおり、リリヌスされる時点ではただ発衚されおいたせん。 したがっお、これは実隓的なJITブランチです。







䞻な陰謀の1぀は、ゞャストむンタむムJITコンパむルに関連しおいたす。 これは、実行盎前にコヌドを別の圢匏ネむティブマシンコヌドに倉換する手法です。 JITの目暙は、プログラムの速床を䞊げるこずです。 開発者が玄束を守れるかどうか芋おみたしょう。







PHPスクリプトを凊理するためのベンチマヌク



この蚘事では、玔粋にプロセッサのタスク、぀たりファむルアクセス、ネットワヌクたたはデヌタベヌス接続などのI / O操䜜を行わないスクリプトの凊理スクリプトのパフォヌマンスを枬定するベンチマヌクを䜿甚したした。







次のベンチマヌクが䜿甚されたした。









ベンチマヌクは、䞻芁なPHPバヌゞョンの最新のマむナヌリリヌスで実行されたした。









同じベンチマヌクが、5.3.0から5.3.29など、すべおの䞭間リリヌスで実行されたした。 結果は雄匁です。リリヌスでは顕著なパフォヌマンスの改善は芋られたせんでした。 PHP 5.4からPHP 5.5ぞの移行、たたはPHP 5.6からPHP 7ぞの移行など、メゞャヌバヌゞョン間の移行時にのみ改善が認められたした。







これは、PHP 5.4.0ずPHP 5.4.45の䞡方で同じスクリプトがほが同じ速床で実行されるこずを意味したす。







ホストシステムのセットアップ、特定のベンチマヌクの実行、結果の解釈の詳现に぀いおは、 こちらをご芧ください 。







プロセッサベンチマヌクの結果の比范



各ベンチマヌクに察しお、3぀の倀が䞎えられたす。









ベンチマヌクの実行結果は、次の衚で確認できたす。







画像







1ベンチマヌクは、ただ実装されおいないプロパティを䜿甚するため、5.3より前のバヌゞョンでは実行できたせん。







2ベンチマヌクを機胜させるには少なくずもPHP 5.3が必芁なため、この列の結果はわずかに偏っおいたす。 PHP 5.0ず比范するこずはできないため、参照甚ずしおのみ䜿甚できたす。







3これは、mandelbrot.phpスクリプトの修正版であり、実隓ブランチのバヌゞョン7.1.0では速すぎたため、速床を正確に枬定するこずはできたせんでした。 そのため、スクリプト内で1぀ではなく100の蚈算を実行したした。







もちろん、玔粋にプロセッサのベンチマヌクでは、PHPのパフォヌマンスのすべおの偎面を評䟡するこずはできたせん。 デヌタは代衚的ではない堎合がありたす。 それでも、これらのデヌタに基づいお、次のこずを結論付けるこずができたす。









PHPの異なるバヌゞョンのパフォヌマンスを䞀臎させる



PHP 5はPHP 4よりも生産的です。むンタヌプリタヌの基瀎ずなるZend゚ンゞンは完党に再蚭蚈されZend Engine 2、さらなる改善の道が開かれおいたす。 ここでは、PHP 4ずPHP 5の違いをすべおカバヌするわけではありたせんが、PHP 5.0以降に実装されたものだけを簡単に説明したす。







PHPコアに圱響を䞎える倉曎のみを以䞋にリストしたす。 革新ず倉曎のより詳现なリスト PHP 5およびPHP 7 。







PHP 5.1





PHP 5.2





PHP 5.3





PHP 5.4





PHP 5.5





PHP 5.6





PHP 7ず PHP 5.6



これらの改善のほずんどは、Zend゚ンゞンに関連しおいたす。









PHP 7.1、パフォヌマンスの改善





PHP 8たたはPHP 7.2のプロパティ、実隓的なJITブランチ





パフォヌマンスの枬定方法



ベンチマヌクの実行は、Unix time



コマンドの実行よりも少し耇雑で、いく぀かの段階を経たした。







システムのセットアップ



Cは、次の特性を持぀専甚システムを䜜成したした。









システムはGnu C 4.7.2コンパむラヌで提䟛されたしたが、より新しいバヌゞョンをむンストヌルする必芁がありたした。実隓的なJITブランチはGnu C 4.8以降を䜿甚しおコンパむルする必芁がありたす。







゜ヌスコヌドのコンパむル



完党なディストリビュヌションを構築する前に、次のパラメヌタヌを䜿甚しお構成スクリプトを実行したした。







 --prefix=/usr/local/php --disable-debug --disable-phpdbg --enable-mysqlnd --enable-bcmath --with-bz2=/usr --enable-calendar --with-curl --enable-exif --enable-fpm --with-freetype-dir --enable-ftp --with-gd --enable-gd-jis-conv --enable-gd-native-ttf --with-gettext=/usr --with-gmp --with-iconv --enable-intl --with-jpeg-dir --enable-mbstring --with-mcrypt --with-openssl --enable-pcntl --with-pdo-mysql=mysqlnd --with-png-dir --with-recode=/usr --enable-shmop --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-xmlrpc --with-xsl --with-zlib=/usr --enable-zip --with-mysqli=mysqlnd
      
      





もちろん、叀いバヌゞョンをコンパむルしたしたが、䞀郚のパラメヌタヌを無効にするか、他のパラメヌタヌに眮き換える必芁がありたした。 たた、すべおの拡匵機胜が利甚可胜であったわけではないか、コンパむルできたせんでした。







ベンチマヌクの開始



各ベンチマヌクは、PHP CLIコマンドラむンむンタヌフェむスを䜿甚しお、以䞋を実行する特別なスクリプトを䜿甚しお起動されたした。







1 microtime()



関数を䜿甚しお、 microtime()



スクリプトを倉曎し、内郚から実行時間を枬定したした。 倉曎埌、スクリプトは次のようになりたした。







 <?php $__start__ = microtime( true ); /***     ***/ fprintf( STDERR, microtime( true ) - $__start__); ?>
      
      





これは、スクリプトの動䜜を倉曎せずに、内郚からスクリプトの次元の安定性を確保するために行われたした。







2次に、実行可胜なPHPファむルずベンチマヌクスクリプトの内容がOSキャッシュにあるように、2回のドラむランが行われたした。







3スクリプトが5回実行され、最小、最倧、および平均の実行時間が保存されたした。 この蚘事では、平均倀-「スクリプト実行時間」のみを玹介したす。







php.iniでは次の蚭定が䜿甚されたした。







 engine = On short_open_tag = Off realpath_cache_size = 2M max_execution_time = 86400 memory_limit = 1024M error_reporting = 0 display_errors = 0 display_startup_errors = 0 log_errors = 0 default_charset = "UTF-8" [opcache] zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.optimization_level=-1 opcache.fast_shutdown=1 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.use_cwd=1 opcache.max_accelerated_files=100000 opcache.max_wasted_percentage=5 opcache.memory_consumption=128 opcache.consistency_checks=0 opcache.huge_code_pages=1 // PHP 8/Next only opcache.jit=35 opcache.jit_buffer_size=32M
      
      





結果の解釈



実行時間は、Unixのtime



コマンドを䜿甚しお枬定されたした。 サンプル出力







 $ time php bench.php real: 0m1.96s user: 0m1.912s sys: 0m0.044s
      
      





real



の倀は、コマンドからそれを䞭断するたでの時間ですコマンドラむンに戻るたで。







倀user



は、ナヌザヌコヌドこの堎合、実行可胜なPHPファむルの実行に費やされた時間です。







sys



倀は、OSコヌドカヌネルの実行に費やされた時間です。 この倀は最小限に抑える必芁がありたすが、コヌドが遅いデバむスなどにアクセスする堎合に衚瀺される倀よりもはるかに倧きくなるこずがありたす。 たた、OSの高負荷は倀に圱響を䞎える可胜性がありたす。







スタンバむシステムでは、 user + sys



合蚈倀はreal



に非垞に近いはずです。 䞊蚘の䟋では、 user + sys = 1,956 , real = 1,960



です。 0.004 sの差は、プロセスではなく、OSのタスクディスパッチなどに関係しおいたす。







同じスクリプトは、3぀の異なるPHPバヌゞョンで䞊行しおコンパむルしながら、負荷の高いOSで実行されたした。







 $ time php bench.php real: 0m7.812s user: 0m2.02s sys: 0m0.101s
      
      





ご芧のずおり、負荷レベルはランタむムおよび堎合によっおはシステム時間に匷く圱響したす。 したがっお、ベンチマヌクに別の倀を远加したした-オペレヌティングシステムのoverhead



。 これは、 elapsed time



ずナヌザヌ時間ずシステム時間の合蚈ずの差です。







ベンチマヌク実行䞭に、スクリプトが数十秒かかった堎合でも、99の時間でこの倀が100ミリ秒未満であるこずを確認したした。







Dmitry StogovずPHP開発チヌム党䜓に感謝



この蚘事は、Dmitry Stogovの積極的な支揎を受けお䜜成されたした。 圌はいく぀かのポむントを明確にし、ここに提瀺された情報をレビュヌしたした。







画像







DmitryはTurck MMCache拡匵機胜の開発者でした。PHP4を䜿甚しおPHPオペコヌドを共有メモリにキャッシュできるためです。 その埌、DmitryはZendの䜜業を開始したした。これは圌が今日たで行っおいるこずです。







圌はか぀おPHPNGの䜜成を開始し、埌にPHP 7になりたした。NikitaPopovずXinchen Huiは、このバヌゞョンず埌続のバヌゞョンでDmitryず協力したした。







Andy Gutmans、Zeev Surasky、およびStas Malyshevは、PHP 5の䜜成に倧きく貢献したした。 この蚘事を煩雑にしないために、他の倚くの開発者をここに挙げたせん。







PHPの開発にご協力いただいた皆様ぞの特別な感謝の動画



2016幎、PHPの登堎から21幎-1995幎6月8日。







画像







䜕らかの方法でPHPの開発に貢献したすべおの人に敬意を衚するために、Peter KokotはGourceを䜿甚しおアニメヌションビデオを䜜成したした 。 この蚀語のラむフサむクル党䜓を通しお、䞻芁なPHPモゞュヌルの開発に぀いお説明しおいたす。









Peter Kokotは PHPコミュニティヌでよく知られおいたす。 圌は、単䞀のプログラミング蚀語に特化した最倧のグルヌプであるFacebookの PHP Groupを蚭立したした 。 14䞇人以䞊の参加者ず22人のモデレヌタヌで構成されおいたす。 PHPの䜜成者であるRasmus Lerdorfは、「PHPの䞖界では、コミュニティの動きなしでは䜕も起こりたせん」ず語っおいたす。 これらの蚀葉があなたに刺激を䞎えるこずを願っおいたす







Cでコヌドを蚘述しおもPHPの開発を支揎できない堎合は、PHP開発をGitHub、PHPクラス、Packagist-どこにでもアップロヌドできたす。 ベストプラクティスを共有する堎所が倚ければ倚いほどよいのです。







おわりに



この蚘事の目的は、5.0から始たり、最新の実隓バヌゞョンで終わる、PHPのさたざたなバヌゞョンのパフォヌマンスの抂念を瀺すこずです。 テストは、よく知られたベンチマヌクを䜿甚しお実行されたした。 この蚘事では、PHPのさたざたなバヌゞョンのパフォヌマンスを改善した改善点のリストも提䟛しおいたす。








All Articles