ホームページ > バックエンド開発 > PHPチュートリアル > [質問] Xu Hanbin: PHP7 と HHVM の間のパフォーマンスに関する論争

[質問] Xu Hanbin: PHP7 と HHVM の間のパフォーマンスに関する論争

WBOY
リリース: 2016-06-23 13:42:37
オリジナル
802 人が閲覧しました

要約: 最近、PHP7 と HHVM の間のパフォーマンスに関する議論が大きな話題になっていますが、どちらも PHP の実行パフォーマンスの向上において画期的な進歩を遂げていることは疑いの余地がありません。今号の「Ask the Bottom」では、Xu Hanbin が科学を普及させ、彼らのパフォーマンス論争を紹介します。

[紹介] Xu Hanbin は、Alibaba と Tencent で 4 年以上テクノロジーの研究開発業務に従事しており、現在は毎日 1 億件を超えるリクエストを処理する Web システムのアップグレードと再構築を担当しています。 Xiaoman Technologyの事業を開始し、SaaSサービス技術の構築に従事しています。最近、PHP7 と HHVM の間のパフォーマンスに関する議論が話題になっていますが、どちらも PHP の実行パフォーマンスの向上において画期的な進歩を遂げています。この記事では、科学を普及させるための 2 つのコミュニティの新しい技術の進歩について言及し、そのパフォーマンスに関する論争を紹介します。


PHP 言語ランキングの推移

「TIOBE プログラミング言語ランキング」 (このリストには統計手法に制限がありますが、それでも十分な参考情報です) によると、2010 年に PHP は世界のプログラミングの中で最高位にランクされました。 3番目に言語。 PHP 言語は、PC インターネット時代の Web 分野で最も強力な言語であることがわかります。


かつて、PHP プログラマの間でこんなジョークが広まりました。

ある女性: このフォーラムにいる全員を喧嘩させることができたら、一緒に食事をしましょう。
PHP プログラマー: PHP は世界で最高の言語です!
某掲示板が大変で色々な言い争いが…
某女性「説得したから行きましょう!」
PHP プログラマー: 今日は違いますが、PHP が最良の言語であるに違いないと彼らを説得しなければなりません。

さて、本題に戻りましょう。言語自体が良いとか悪いとかではなく、それが使用されるシナリオでさまざまな問題を解決するだけです。インターネット時代は非常に急速に進み、モバイル インターネットの登場により、わずか 4 年余りでモバイル テクノロジーの発展が世界を席巻しました。同時にさまざまな言語が台頭しており、かつて栄華を誇ったPHPは当初のプログラミング言語リスト(2014年12月リスト)からは6位に落ちています。その結果、PHPを悪く言う声が次々と出た。


しかし、Niao 兄弟 (Hui Xinchen、PHP 言語開発者の 1 人) は、2014 年の Qcon でデータを共有しました。 世界の上位 100 万の Web サイトのうち、81.3% が Web サーバー スクリプト言語を使用しています。それは PHP です。 2013 年の同時期は 78.3% でした。言い換えれば、Web サービスにおける PHP の使用は減っていませんが、モバイル インターネットの波の中で、他の多くの言語テクノロジ アプリケーションが追加されたため、PHP の使用量は薄まっています。

最近、PHP7 と HHVM のパフォーマンス比較が話題になり、どちらが PHP パフォーマンスの向上につながるかについて誰もが議論し、注目しています。

HHVM (HipHop Virtual Machine) の起源

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 が同じ変数を定義する場合、実際に対応するストレージ構造は次のとおりです:


この構造PHP での定義は次のとおりです:

$a = 200;//この変数は実際には C 変数と比較して何倍もの記憶領域を占有します。

実際、PHP では、格納されるデータの種類に関係なく、上記の「オールインワン」構造を使用して実装されます。 PHP プログラマーの変数タイプの「侵入」と互換性を持たせるために、PHP は開発者には親切ですが、実行エンジンには残酷です。単一変数のメモリ消費量はまだ明らかではないかもしれませんが、PHP 配列が使用されると、複雑さは指数関数的に増加します (配列の実装は HashTable です)。次に、Zend エンジンが実行されると、これらの PHP コードはオペコード (PHP の中間バイトコード、形式はアセンブリに似ています) にコンパイルされ、Zend エンジンによって 1 行ずつ解釈されて実行されます。

文字列の接続操作にしても、配列などの単純な変更にしても、ほぼ「PHP プログラマーの一言で Zend エンジンが壊れる」というリズムです。したがって、同じ操作を行う場合、PHP は C よりも CPU やメモリなどのシステム リソースをより多く消費します。また、自動メモリリサイクルや変数の型判定などもあり、システムリソースの消費量が増加します。

たとえば、純粋な PHP に実装されているクイック ソート関数とネイティブ ソート関数を使用して、時間のかかる比較を行うために 10,000 個の整数をソートしました。結果は次のとおりです。


ネイティブ ソートには 3.44 ミリ秒かかりました。 、そして私たちのもの 私が実装したPHP関数sortには68.79ミリ秒かかります。両者の間には実行効率に大きな差があることがわかりました。私のテスト方法は、PHP スクリプト全体の開始から終了までの時間ではなく、関数の実行前後の時間間隔を計算することです。 PHP スクリプトの起動およびシャットダウンのプロセス自体には、一連の初期化とクリーンアップ作業が含まれており、これにも多くの時間がかかります。



通常、PHP の実行効率のランキングは次のとおりです:

  1. 最も速いのは、PHP 言語の一部である PHP 言語構造 (isset、echo など) です (これらは PHP 言語ではありません)。まったく機能しません)。
  2. 次に、高速なものは PHP のネイティブ関数と拡張関数です。 Zend API に基づく PHP 拡張機能は C で関数を実装しており、その実行効率は C++/Java と同程度です。
  3. 本当に遅いのは、PHP を通じて自分で作成したコードと関数です。たとえば、純粋な PHP で実装された比較的重いフレームワークを使用すると、フレームワーク自体に多くのモジュールが含まれるため、言語レベルでの実行効率が明らかに低下し、より多くのメモリを占有することになります。 (国産の Yaf フレームワークは拡張的に実装されているため、純粋な PHP で書かれたフレームワークよりも実行効率が大幅に高速です)


一般的に、複雑な論理演算を PHP で実装することはお勧めしません。特に Web システムのトラフィックが比較的大きいシナリオでは、計算が機能します。したがって、PHP プログラマは、PHP のさまざまなネイティブ関数とさまざまな拡張機能を比較的幅広く理解しており、特定の関数実装シナリオでは、複雑な PHP コードのスタックを自分で作成するのではなく、よりネイティブなソリューション (ネイティブ インターフェイスまたは拡張機能) を探す必要があります。機能の種類。

十分な PHP 拡張機能の開発能力がある場合は、この種のビジネス関数を PHP 拡張機能として書き直すと、コードの実行効率も大幅に向上します。これは非常に優れた方法であり、PHP の最適化でも広く使用されています。ただし、自分で作成した PHP ビジネス開発の欠点も明らかです。

  1. 拡張開発には時間がかかり、要件が変更された場合の修正が複雑になる可能性があります。 (たとえば、Apache のワーカー モードでは、マルチスレッド シナリオでハングすると、同じプロセス内の他の通常のサブスレッドに影響します。マルチスレッド Web モードの場合、拡張機能の作成でもスレッド セーフをサポートする必要があります。 )
  2. PHP の拡張機能 バージョンをアップグレードする場合、追加の互換性作業が必要になる場合があります。
  3. 人事異動後の維持費や引き継ぎ費も比較的高額です。

実際、第一線のインターネット企業の間では、より一般的な解決策は、PHP 拡張機能を追加するのではなく、C/C++ で独自にサービス サーバーを作成し、PHP がソケットを介してサービス サーバーと通信して完了することです。ビジネス処理と PHP 自体をビジネスと組み合わせないでください。

ただし、Web サービスのパフォーマンスのボトルネックのほとんどは、ネットワーク送信や他のサービス サーバー (MySQL など) に時間がかかることにあります。PHP の実行にかかる時間は、全体の時間に占める割合はごくわずかです。したがって、ビジネスの観点から見ると、その影響は明らかではないかもしれません。

2. HHVM が PHP の実行パフォーマンスを向上させる方法

HHVM が PHP のパフォーマンスを向上させる方法は、PHP の中間バイトコードを生成および実行するように Zend エンジンを置き換えることです (HHVM は独自の形式の中間バイトコードを生成します)。 JIT を介して実行するためにマシン コードに変換されます (Just In Time、ジャストインタイム コンパイルはソフトウェア最適化テクノロジであり、実行中にのみバイトコードがマシン コードにコンパイルされることを意味します)。 Zend エンジンのデフォルトのアプローチでは、まずオペコードにコンパイルし、次にそれを 1 つずつ実行します。通常、各命令は C 言語レベルの関数に対応します。多数の繰り返しオペコード (純粋な PHP で書かれたコードと関数) を生成すると、Zend はこれらの C コードを 1 つずつ複数回実行します。 JIT が行うことは、さらに一歩進んで、実行効率を向上させるために、繰り返し実行される多数のバイトコードを実行時にマシンコードにコンパイルすることです。通常、JIT がトリガーされる条件は、コードまたは関数が複数回呼び出される場合です。


通常の PHP コードでは、変数の型を固定できないため、型を決定するための追加のロジック コードを追加する必要があります。この PHP コードは CPU の実行と最適化に役立ちません。したがって、HHVM は通常、変数の型を固定して仮想マシンのコンパイルと実行を容易にするために、Hack 記述メソッド (特定の機能と互換性を持たせるために追加された追加の技術コード) を備えた PHP コードを使用して「連携」する必要があります。 PHP はすべての型を 1 つの形式で収容することを追求しますが、Hack は収容されるすべてのものを特定の型でマークできます。

PHPコードのHack記述方法の例:


上記の例では、PHP コードは主に変数の型を追加しています。 Hack ライティングの全体的な方向性は、これまでの「動的」な書き込み方法を、HHVM と連携する「静的」な書き込み方法に変更することです。

HHVM はそのパフォーマンスの高さから大きな注目を集めており、一部の一流インターネット企業も追随して使用し始めています。純粋言語の実行パフォーマンス テストの結果から判断すると、HHVM は開発中の PHP7 バージョンよりもはるかに優れています。


ただし、特定のビジネス シナリオの観点から見ると、HHVM と PHP7 の間のギャップはそれほど大きくはありません。WordPress オープンソース ブログ ホームページを使用したテスト シナリオの結果では、現在のギャップは明らかではありません。


ただし、利用可能な技術的ソリューションから判断すると、PHP7 はまだ開発中です。ただし、HHVM の展開とアプリケーションにはいくつかの問題があります。

  1. サービスの展開は比較的複雑で、一定のメンテナンス コストがかかります。
  2. PHP ネイティブ コードは完全にはサポートされておらず、PHP 拡張機能も適切に互換性がある必要があります。
  3. HHVM は新しい仮想マシンであるため、長時間実行するとメモリ リークが発生する可能性があります。 (一流のインターネット企業がこの技術を適用する場合、自社でパッチを適用することでメモリ リークを解決していると言われています)

結局のところ、HHVM は比較的新しいオープンソース プロジェクトであり、開発と成熟にはまだ時間がかかります。 。

PHP7 のパフォーマンス革新

PHP が長い間批判されてきたパフォーマンスの問題は、このバージョンでは大幅に改善されます。このバージョンには途中の PHP6 が存在せず、その後、ほとんどの機能が 5.x バージョンで実装されたため、次のメジャー バージョンはそのまま PHP7 になると言われています。 。 (数年前、私も PHP6 に関する本を読みました。)

1. PHP7 の紹介

PHP7 の正式版は 2015 年 10 月までリリースされない可能性がありますが、来年 6 月にはベータ版が公開される予定ですその後 3 ~ 4 か月の品質保証が付きます。

PHP コミュニティのプロジェクト計画は次のとおりです:


プロジェクトはまだ開発中であるため、表からわかる機能の説明は比較的曖昧です。他にも間違いなく他にも機能がありますが、まだ発表されていないだけです。以下は PHP コミュニティからのものです。PHP7 は開発中のプロジェクトであるため、以下は正確ではない可能性がありますが、参照することを妨げるものではありません。

  1. PHPNG (PHP 次世代、次世代 PHP)、Zend 実行エンジン自体のさまざまなパフォーマンスの最適化。そのうちの JIT は Zend Opcache コンポーネントに実装される場合があります。
  2. AST (抽象構文ツリー) は、インタープリターからオペコードを直接吐き出す方法を置き換えるために、PHP コンパイル プロセスにミドルウェアを導入するように設計されています。インタプリタとコンパイラを分離すると、多くのハック コードが削減され、同時に実装の理解と保守が容易になります。
  3. 統一変数構文 (統一変数構文) は、内部的に一貫した完全な変数構文を導入し、PHP パーサーがさまざまなタイプの変数をより完全にサポートできるようにします。変数 $$a など、いくつかの変数の使用法を調整する必要があります。
  4. NaN、Infinity、<<、>> などの整数セマンティクス (整数セマンティクス) をサポートし、list() の一貫性を修正します。

上記の機能の中で、最も期待されているのは PHPng のパフォーマンスの最適化です。PHP コミュニティはいくつかのパフォーマンス速度テスト データを公開しています。データから判断すると、PHPng の実行パフォーマンスはプロジェクト開始時に比べて 2 倍近くになっています。この結果はすでに非常に良好です。さらに、最も重要なことは、PHP7 の最適化計画がまだ完了していないことが多いということです。すべてが完成すれば、よりパフォーマンスの高いPHP7が見られると思います。

この速度テスト データは PHP コミュニティ (wiki.php.net/phpng) から取得したもので、データの一部をインターセプトしています:


現在の PHP5.6 バージョンでは、10 月の PHPNG のパフォーマンス向上は次のとおりです。非常に明白:


簡単な翻訳:

  • 総合的なテスト速度が 35% 向上します。
  • 実際のアプリケーションシナリオでは、20% ~ 70% の速度向上が見られます (WordPress ホームページでは 60% の改善があります)
  • メモリ消費量の削減
  • 最も一般的に使用される SAPI をサポートします
  • リソース割り当てにバインドされたほとんどの PHP 拡張機能をサポートします ( 69 個が完了、6 個が移行予定)
  • HHVM3.3.0 に匹敵する実行速度を実現
  • 2. PHP の弱い型論争

    PHP には多くの物議を醸す機能がありますが、言語バージョンがリリースされ洗練されてきたため、機能や機能に対する批判は減少し始めました。しかし、PHP の「弱い型」機能は明らかにより物議を醸しています。HHVM が Hack を通じて「弱い型」機能を直接「削除」したという事実から、HHVM が「弱い型」機能を好まないことがわかります。しかし、私たちの多くの PHP プログラマーの目には、これは PHP の重要な利点の 1 つです。 PHP の変数は、カジュアルかつエレガントになるように設計されており、言語がよりシンプルになると思いませんか。

    実際、これを深刻な問題だと考える人もおり、「弱い型付け」に対する批判はおおよそ次のとおりです。

    1. 「厳密な」言語では、通常、変数の型は最初から最後まで固定されており、使用範囲も固定されています。 PHP 変数に関しては、通常は名前しか確認できず、ほとんどの型は事前定義できず、自由に変更できます。 (メモリ割り当ての管理は容易ではありません)
    2. 弱い型の機能と互換性を持たせるために、PHP は型判定、型変換、格納メソッドなどを含む互換性のあるコードを多数実装する必要があり、内部の複雑さが増加します。言語の。 (非効率な実行)
    3. 変数の型は制御不可能です。実行プロセス中に多数の「暗黙的な型変換」が行われ、予測不可能な結果が発生しやすいです。 (ここで、PHP の型変換はマスターしなければならない点であることを強調する必要があります。さまざまな型を相互に変換すると、特に PHP を初めて使用する学生にとっては、多くの問題が発生する可能性があります。)

    彼らは、これらが「見たものがそのまま得られる」というシンプルさと、厳密な文法を持つ言語の方が効率的で「理解」しやすいのです。

    JavaScript などの言語も、この問題に関しては同様の動作をするため、同様に批判されています。しかし、ある言語が最終的に大規模に使用されるようになった場合、それには必ず理由があるはずです。 PHP が Web サービス開発に最適なスクリプト言語となり、JavaScript が Web フロントエンド分野を直接支配するようになったのは、開発者が PHP に投票したのは偶然ではありません。プログラミング言語は人間と機械の架け橋であり、究極の追求は「誰もがプログラミングできるようにする」という壮大な目標を達成することです。

    0と1の機械語から始まり、アセンブリ言語、C言語、そしてダイナミックスクリプト言語PHPという言語開発の歴史を見ていきます。実行効率は指数関数的に減少しますが、学習閾値も指数関数的に減少します。 PHP 言語は、C のメモリ管理とポインタの複雑さを保護するだけでなく、変数型の複雑さもさらに保護します。プロジェクト開発の効率が向上し、学習の敷居が下がりますが、同時に実行パフォーマンスがある程度犠牲になります。そして、HHVM の Hack は変数の複雑さを再び導入する「原始への回帰」の感覚を与えます。もちろん、言語が異なれば、異なるシナリオで問題が解決されるため、一般化することはできません。


    まとめ

    HHVM の PHP に対するパフォーマンスの向上は目覚ましく、強力な PHP7 が大いに期待されています。どちらも優れたオープンソース プロジェクトであり、常に前進し、発展しています。現時点では、PHP7 の正式バージョンがリリースされるまでにはまだ長い時間がかかるため、パフォーマンス最適化ソリューションの現在の選択肢はもちろん HHVM です。ただし、個人的には、PHP コードとの下位互換性が高いため、PHP7 についてはより楽観的です。両者の性能に大きな差がない場合は、シンプルな方を選択します。

    参考:

  • https://wiki.php.net/rfc/php7timeline
  • https://wiki.php.net/phpng
  • http://hhvm.com/
  • その他の「Ask the Bottom」コンテンツ

  • [Ask the Bottom] Yan Lan: データ マイニング入門 (1) ??単語分割
  • [Ask the Bottom] ヤオ ユウが Twitter の 100 テラバイト Redis キャッシュの実践について語る
  • [下に聞く] Wang Shuai: PHP カーネルの詳細 (1)?? 弱く型付けされた変数の原理を探る
  • [下に聞く] Wang Shuai: SAPI の詳細を調べる
  • [底に聞く] Wang Shuai: PHP カーネルを深く掘り下げる (3) カーネル武器のハッシュ テーブルとハッシュ衝突攻撃
  • [底に聞く] Jingxing: FastJSON 実装の詳細な説明
  • [底に聞く] Li Ping: 大規模 Web サイトの魂?? パフォーマンス
  • [要点を聞く] ] Xu Peng: Spark+Cassandra を使用して高性能データ分析プラットフォームを作成する (1)
  • 【要点を尋ねる】 Xu Peng: を使用するSpark+Cassandra による高性能データ分析プラットフォームの構築 (2)
  • 【要点を聞く】Xu Hanbin: 大規模 Web サイト アーキテクチャのビッグ キャッシュ メカニズムと幾何学的フラクタル
  • 【質問】Xu Hanbin: 構築10億レベルのWebシステム?? 単一マシンから分散クラスタへ
  • 【質問】Xu Hanbin: Webシステムの大規模な同時並行性?? Eコマースのフラッシュセールと購入ラッシュ
  • 【下の方に質問】Xu Hanbin: PHP7 と HHVM のパフォーマンスの戦い
  • 【Ask the Bottom】天河-2 での OpenStack の大規模導入実践
  • 「Ask the Bottom」は、実践ベースで個人的な洞察を共有する CSDN クラウド コンピューティング チャネルの新しいコラムです新しい時代のソフトウェアアーキテクチャと研究開発へ。 「【質問】」というタイトルの記事では、外資系IT大手のアーキテクチャ共有や、国内のシニアエンジニアによるある技術の実践的なまとめ、新技術の探索などに関する一連の質問が掲載されています。 「Ask the Bottom」では、テクノロジーに関するユニークで深い洞察力を持つあなたを招待し、テクノロジーのみに属する空を作成します。 詳細については、zhonghao@csdn.net までメールでお問い合わせください。

    編集者/Zhong Hao

    ビッグデータ エコシステムに関する詳細情報を入手するには、「CSDN ビッグ データ」WeChat アカウントに登録することを歓迎します。

    @CSDNCloud Computing Weibo をフォローして、最新のクラウド コンピューティングとビッグ データの情報について学びましょう。


    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート