[質問] Xu Hanbin: PHP7 と HHVM の間のパフォーマンスの戦い
[紹介] Xu Hanbin は、Alibaba と Tencent で 4 年以上テクノロジーの研究開発業務に従事しており、毎日 1 億件を超えるリクエストが発生する Web システムのアップグレードと再構築を担当しています。現在はXiaoman Technologyで起業し、SaaSサービスの技術構築に従事。最近、PHP7 と HHVM の間のパフォーマンスに関する議論が話題になっていますが、どちらも PHP の実行パフォーマンスの向上において画期的な進歩を遂げています。この記事では、科学を普及させるための 2 つのコミュニティの新しい技術の進歩について言及し、そのパフォーマンスに関する論争を紹介します。
「TIOBEプログラミング言語ランキング」による(ただし、リストの統計手法は限定されている) 、それはまだより良い参考資料です)、2010 年には、PHP はかつて世界のプログラミング言語の中で 3 位にランクされていました。 PHP 言語は、PC インターネット時代の Web 分野で最も強力な言語であることがわかります。
かつて、PHP プログラマーの間で次のようなジョークが広まりました。
ある女性: Can you Ifこのフォーラムのみんなが騒がしくなるので、一緒にご飯を食べます。
PHP プログラマー: PHP は世界で最高の言語です!
あるフォーラムはあらゆる種類の口論で爆発しました...
ある女性: 説得しました、行きましょう!
PHP プログラマー: 今日は違いますが、PHP が最高の言語に違いないことを彼らに説得しなければなりません。
さて、本題に入りましょう。言語自体が良いとか悪いとかではなく、それが使用されるシナリオでさまざまな問題を解決するだけです。インターネット時代は非常に速く進み、モバイル インターネットの登場により、わずか 4 年余りでモバイル テクノロジーの発展が世界を席巻しました。同時にさまざまな言語が台頭しており、かつて栄華を誇ったPHPはオリジナルのプログラミング言語リスト(2014年12月リスト)からは6位に落ちています。その結果、PHPを悪く言う声が次々と出た。
しかし、Niao 兄弟 (PHP 言語開発者の 1 人である Hui Xinchen) は、2014 年の Qcon でデータを共有しました。世界の上位 100 万の Web サイトのうち、81.3% が Web サーバーのスクリプト言語として PHP を使用しています。 2013 年の同時期は 78.3% でした。言い換えれば、Web サービスにおける PHP の使用は減っていませんが、モバイル インターネットの波の中で、他の多くの言語テクノロジ アプリケーションが追加されたため、PHP の使用量は薄まっています。
最近、PHP7 と HHVM のパフォーマンス比較が話題になり、どちらが PHP のパフォーマンス向上につながるかについて誰もが議論し、注目しています。
HHVM は、JIT コンパイルおよびその他のテクノロジを使用して、PHP コードの実行パフォーマンスを大幅に向上させるオープンソースの PHP 仮想マシンです。現在のバージョンのネイティブ PHP コードの実行パフォーマンスは 5 ~ 10 倍向上する可能性があると噂されています。
HHVM は Facebook から生まれました。Facebook の初期のコードの多くは PHP を使用して開発されました。しかし、ビジネスの急速な発展に伴い、PHP の実行効率がますます明らかになってきました。実行効率を最適化するために、Facebook は 2008 年に PHP 実行エンジンである HipHop の使用を開始しました。これは元々、Facebook の大量の PHP コードを C++ に変換してパフォーマンスを向上させ、リソースを節約するために設計されました。 HipHop を使用した PHP コードのパフォーマンスは数倍向上しました。その後、Facebook は HipHop プラットフォームをオープンソース化し、徐々に現在の HHVM に発展させました。
1. PHP が遅いのはなぜですか?
PHP は C/C++ レベルの言語よりも遅いです。実際、PHP 言語は元々、コンピューティング集約型のアプリケーション シナリオを解決するように設計されたものではありません。 PHP は開発効率を高めるために実行効率を犠牲にしていることが大まかに理解できます。
PHP の大きな特徴は弱い型の機能であることはわかっています。つまり、変数を自由に定義して、それをさまざまな種類のデータに自由に割り当てることができます。 C 言語の int 整数値を例に挙げます。
int num = 200; // 通常は 4 バイト
ただし、PHP が同じ変数を定義する場合、実際に対応するストレージ構造は次のようになります。 :
この構造体は C 変数よりもはるかに多くのメモリを占有します。PHP では次のように定義されます:
$a = 200;/ /この変数は実際には、C 変数と比較して何倍もの記憶領域を占有します。
実際、PHP では、格納されるデータの種類に関係なく、上記の「killing」構造を使用して実装されます。 PHP プログラマーの変数タイプの「侵入」と互換性を持たせるために、PHP は開発者には親切ですが、実行エンジンには残酷です。単一変数のメモリ消費量はまだ明らかではないかもしれませんが、PHP 配列が使用されると、複雑さは指数関数的に増加します (配列の実装は HashTable です)。次に、Zend エンジンが実行されると、これらの PHP コードはオペコード (PHP の中間バイトコード、形式はアセンブリに似ています) にコンパイルされ、Zend エンジンによって 1 行ずつ解釈されて実行されます。
文字列の接続操作にしても、配列などの単純な変更にしても、ほぼ「PHP プログラマーの一言で Zend エンジンが壊れる」というリズムです。したがって、同じ操作に対して、PHP は C よりも CPU やメモリなどのシステム リソースをより多く消費します。また、自動メモリリサイクルや変数の型判定などもあり、システムリソースの消費量が増加します。
たとえば、純粋な PHP に実装されているクイック ソート関数とネイティブ ソート関数を使用して、時間のかかる比較を行うために 10,000 個の整数を並べ替えました。結果は次のとおりです。
ネイティブのソートには 3.44 ミリ秒かかりますが、独自に実装した PHP 関数のソートには 68.79 ミリ秒かかります。両者の間には実行効率に大きな差があることがわかりました。私のテスト方法は、PHP スクリプト全体の開始から終了までの時間ではなく、関数の実行前後の時間間隔を計算することです。 PHP スクリプトの起動とシャットダウンのプロセス自体には、一連の初期化とクリーンアップ作業が含まれており、これにも多くの時間がかかります。
通常、PHP の実行効率のランキングは次のとおりです:
通常の状況では、特に Web システムのトラフィックが比較的大きいシナリオでは、PHP を使用して複雑な論理計算を伴う関数を実装することはお勧めしません。したがって、PHP プログラマは、PHP のさまざまなネイティブ関数とさまざまな拡張機能を比較的幅広く理解しており、特定の関数実装シナリオでは、複雑な PHP コードのスタックを自分で作成するのではなく、よりネイティブなソリューション (ネイティブ インターフェイスまたは拡張機能) を探す必要があります。機能の種類。
十分な PHP 拡張機能の開発能力がある場合は、この種のビジネス関数を PHP 拡張機能として書き直すことによって、コードの実行効率も大幅に向上します。これは非常に優れた方法であり、PHP の最適化でも広く使用されています。ただし、自作の PHP ビジネス開発の欠点も明らかです。
実際、一流インターネット企業の間では、より一般的な解決策は、PHP 拡張機能を追加するのではなく、サービス サーバーを C/C++ で独立して作成し、その後、 PHP はソケットを渡します。 PHP 自体をビジネスに結び付けることなく、サービス サーバーと通信してビジネス処理を完了します。
しかし、Web サービスのパフォーマンスのボトルネックのほとんどは、ネットワーク送信や他のサービス サーバー (MySQL など) に時間がかかることにあります。PHP の実行にかかる時間は、全体の時間に占める割合は非常にわずかです。とはいえ、ビジネスの観点から見ると、その影響は明らかではないかもしれません。
2. HHVM が PHP の実行パフォーマンスを向上させる方法
HHVM が PHP のパフォーマンスを向上させる方法は、Zend エンジンを置き換えて中間バイトを生成および実行することです。 PHP コード (HHVM は独自の形式で中間バイトコードを生成します) を生成し、JIT (ジャスト イン タイム、ジャストインタイム コンパイルはソフトウェア最適化テクノロジです) を通じて実行するためにマシン コードに変換されます。つまり、バイトコードは実行時のマシンコード)。 Zend エンジンのデフォルトのアプローチでは、まずオペコードにコンパイルし、次にそれを 1 つずつ実行します。通常、各命令は C 言語レベルの関数に対応します。多数の繰り返しオペコード (純粋な PHP で書かれたコードと関数) を生成すると、Zend はこれらの C コードを 1 つずつ複数回実行します。 JIT が行うことは、さらに一歩進んで、実行効率を向上させるために、繰り返し実行される多数のバイトコードを実行時にマシンコードにコンパイルすることです。通常、JIT がトリガーされる条件は、コードまたは関数が複数回呼び出される場合です。
通常の PHP コード。変数の型を固定できないため、型を決定するロジック コードを追加する必要があります。このような PHP コードは役に立ちません。 CPU の実行と最適化。したがって、HHVM は通常、変数の型を固定して仮想マシンのコンパイルと実行を容易にするために、Hack 記述メソッド (特定の機能と互換性を持たせるために追加された追加の技術コード) を備えた PHP コードを使用して「連携」する必要があります。 PHP はすべての型を 1 つの形式で収容することを追求しますが、Hack は収容されるすべてのものを特定の型でマークできます。
PHP コードのハック記述例:
上記の例では主に変数型を追加した PHP コードを追加しています。 Hack ライティングの全体的な方向性は、これまでの「動的」な書き込み方法を、HHVM と連携する「静的」な書き込み方法に変更することです。
HHVM はそのパフォーマンスの高さから大きな注目を集めており、一部の一流インターネット企業も追随し始めています。純粋言語の実行パフォーマンス テストの結果から判断すると、HHVM は開発中の PHP7 バージョンよりもはるかに優れています。
ただし、特定のビジネス シナリオの観点から見ると、WordPress オープン ソース ブログ ホームページをテスト シナリオとして使用すると、HHVM と PHP7 の間のギャップはそれほど大きくありません。現在のギャップは大きくありません。
ただし、利用可能な技術ソリューションから判断すると、現在の HHVM の方がわずかに優れています。ただし、HHVM の展開とアプリケーションにはいくつかの問題があります。
HHVM は結局のところ、比較的新しいオープンソース プロジェクトであり、成熟するにはまだ時間がかかります。
長い間批判されてきた PHP のパフォーマンスの問題は、このバージョンでは大幅に改善されます。このバージョンには途中の PHP6 が存在せず、その後、ほとんどの機能が 5.x バージョンで実装されたため、次のメジャー バージョンはそのまま PHP7 になると言われています。 。 (数年前、私も PHP6 に関する本を読みました。)
1. PHP7 の紹介
PHP7 の正式版は 2015 年までリリースされない可能性があります。は 10 月にリリースされたばかりですが、テスト版は来年 6 月に公開され、その後 3 ~ 4 か月の品質保証が提供される予定です。
PHP コミュニティのプロジェクト計画は次のとおりです。
プロジェクトはまだ開発中であるため、表で確認できる機能の説明は比較的曖昧です。他にも間違いなく他にも機能がありますが、まだ発表されていないだけです。以下は PHP コミュニティからのものです。PHP7 は開発中のプロジェクトであるため、以下は正確ではない可能性がありますが、参照することを妨げるものではありません。
上記の機能の中で、最も期待されているのは PHPng のパフォーマンスの最適化です。PHP コミュニティはいくつかのパフォーマンス速度テスト データを公開しています。データから判断すると、PHPng の実行パフォーマンスはプロジェクト開始時に比べて 2 倍近くになっています。この結果はすでに非常に良好です。さらに、最も重要なことは、PHP7 の最適化計画がまだ完了していないことが多いということです。すべてが完成すれば、よりパフォーマンスの高いPHP7が見られると思います。
この速度テスト データは PHP コミュニティ (wiki.php.net/phpng) から取得されており、データの一部は傍受されています:
現在の PHP5.6 バージョンでは、10 月の PHPNG のパフォーマンスの向上は非常に明白です:
単純な翻訳:
2. PHP の弱い型論争
PHP には多くの物議を醸す機能がありますが、言語バージョンがリリースされ改善されるにつれて、機能や機能に対する批判は減り始めました。しかし、PHP の「弱い型」機能は明らかにより物議を醸しています。HHVM が Hack を通じて「弱い型」機能を直接「削除」したという事実から、HHVM が「弱い型」機能を好まないことがわかります。しかし、私たちの多くの PHP プログラマーの目には、これは PHP の重要な利点の 1 つです。 PHP の変数は、カジュアルかつエレガントになるように設計されており、言語がよりシンプルになると思いませんか。
実際、これは深刻な問題だと考える人もおり、「弱い型付け」に対する批判は次のようになります。
彼らは、これらは「見たものがそのまま得られる」という単純さとは一致せず、厳密な文法を持つ言語の方が効率的で「理解」しやすいと信じています。
JavaScript などの言語も、この問題に関しては同様の動作をするため、同様に批判されています。しかし、ある言語が最終的に大規模に使用されるようになった場合、それには必ず理由があるはずです。 PHP が Web サービス開発に最適なスクリプト言語となり、JavaScript が Web フロントエンド分野を直接支配するようになったのは、開発者が PHP に投票したのは偶然ではありません。プログラミング言語は人間と機械の架け橋であり、究極の追求は「誰もがプログラミングできるようにする」という壮大な目標を達成することです。
言語開発の歴史を通して、私たちは 0 と 1 の機械語コードから始まり、アセンブリ言語、C 言語、そして動的スクリプト言語 PHP に至りました。実行効率は指数関数的に減少しますが、学習閾値も指数関数的に減少します。 PHP 言語は、C のメモリ管理とポインタの複雑さを保護するだけでなく、変数型の複雑さもさらに保護します。プロジェクト開発の効率が向上し、学習の敷居が下がりますが、同時に実行パフォーマンスがある程度犠牲になります。そして、HHVM の Hack は変数の複雑さを再び導入する「原始への回帰」の感覚を与えます。もちろん、言語が異なれば、異なるシナリオで問題が解決されるため、一般化することはできません。
HHVM の PHP に対するパフォーマンスの向上は目覚ましく、強力な PHP7 が大いに期待されています。どちらも優れたオープンソース プロジェクトであり、常に前進し、発展しています。現時点では、PHP7 の正式バージョンがリリースされるまでにはまだ長い時間がかかるため、パフォーマンス最適化ソリューションの現在の選択肢はもちろん HHVM です。ただし、個人的には、PHP コードとの下位互換性が高いため、PHP7 についてはより楽観的です。両者の性能に大きな差がない場合は、シンプルな方を選択します。
参考:
その他の「質問」コンテンツ
[email protected]情報。