ホームページ  >  記事  >  バックエンド開発  >  PHP7 と HHVM の間のパフォーマンスの戦いを見てください。

PHP7 と HHVM の間のパフォーマンスの戦いを見てください。

coldplay.xixi
coldplay.xixi転載
2020-06-24 17:47:023558ブラウズ


PHP7 と HHVM の間のパフォーマンスの戦いを見てください。

最近、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 が同じ変数を定義する場合、実際に対応する記憶構造は次のようになります。 :

この構造体は 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 の実行効率のランキングは次のとおりです。

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

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

十分な PHP 拡張機能の開発能力がある場合は、この種のビジネス関数を PHP 拡張機能として書き直すことによって、コードの実行効率も大幅に向上します。これは非常に優れた方法であり、PHP の最適化でも広く使用されています。ただし、自作の PHP ビジネス開発には、拡張開発に時間がかかる、要件が変わると修正が煩雑になる、書き方が悪いと Web サービスの安定性に影響を与える可能性があるなどの欠点も明らかです。 (たとえば、Apache のワーカー モードでは、マルチスレッド シナリオでハングすると、同じプロセス内の他の通常のサブスレッドに影響します。マルチスレッド Web モードの場合、書き込み拡張機能はスレッド セーフをサポートする必要があります。 )

    拡張 PHP バージョンをアップグレードする場合、追加の互換性作業が必要になる場合があります。
  1. 人事異動後の維持費や引き継ぎ費も比較的高額です。
  2. 実際、第一線のインターネット企業の間では、より一般的なソリューションは、PHP 拡張機能を追加するのではなく、C/C を使用して独自にサービス サーバーを作成し、PHP がサービスと通信することです。ビジネス処理は、PHP 自体とビジネスを結び付けません。
ただし、Web サービスのパフォーマンスのボトルネックのほとんどは、ネットワーク送信や他のサービス サーバー (MySQL など) に時間がかかることにあります。PHP の実行にかかる時間は、非常に小さな影響を及ぼします。かかる時間は全体に占める割合が大きいため、ビジネスの観点から見ると、その影響は明らかではない可能性があります。

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

HHVM が PHP のパフォーマンスを向上させる方法は、PHP の生成と実行を行う Zend エンジンを置き換えることです。中間バイトコード (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 バージョンよりもはるかに優れています。

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

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

サービスの展開は複雑で、一定のメンテナンス費用がかかります。

    PHP ネイティブ コードは完全にはサポートされていないため、PHP 拡張機能にも適切な互換性が必要です。
  1. 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. 10 月のバージョン 6、PHPNG のパフォーマンスの向上は非常に明白です:

単純な翻訳:

  • 総合的なテスト速度が 35% 向上しました。 。
  • 実際のアプリケーション シナリオでは、20% ~ 70% の速度向上が見られます (WordPress ホームページでは 60% の向上があります)
  • メモリ消費量の削減
  • 最も一般的に使用されるサポートSAPIs
  • リソース割り当てにバインドされたほとんどの 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 フロントエンド分野を直接支配していますが、ここまで到達したのは偶然ではなく、開発者が自らの足で投票しました。プログラミング言語は人間と機械の架け橋であり、究極の追求は「誰もがプログラミングできるようにする」という壮大な目標を達成することです。

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

概要

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

推奨チュートリアル: 「php ビデオ チュートリアル

以上がPHP7 と HHVM の間のパフォーマンスの戦いを見てください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。