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 の実行効率のランキングは次のとおりです。
- 最も速いのは PHP 言語構造 (isset、echo など)、 PHP 言語の一部 (これらはまったく関数ではありません)。
- そして、高速なものは PHP のネイティブ関数と拡張関数です。 Zend API に基づいた PHP 拡張機能、関数は C で実装されており、実行効率は C/Java と同程度です。
- 本当に遅いのは、PHP を通じて自分で作成したコードと関数です。たとえば、純粋な PHP で実装された比較的重いフレームワークを使用すると、フレームワーク自体に多くのモジュールが含まれるため、言語レベルでの実行効率が明らかに低下し、より多くのメモリを占有することになります。 (国産のYafフレームワークを拡張して実装しているため、純粋なPHPで書かれたフレームワークよりも実行効率が大幅に高速です)
通常の状況では、特に Web システムのトラフィックが比較的大きいシナリオでは、PHP を使用して複雑な論理計算関数を実装することはお勧めしません。したがって、PHP プログラマーは、PHP のさまざまなネイティブ関数とさまざまな拡張機能について比較的幅広い理解を持っている必要があります。特定の関数実装シナリオでは、自分でソリューションを作成するのではなく、よりネイティブなソリューション (ネイティブ インターフェイスまたは拡張機能) を探してください。これを実装するための複雑な PHP コードのスタック機能の種類。
十分な PHP 拡張機能の開発能力がある場合は、この種のビジネス関数を PHP 拡張機能として書き直すことによって、コードの実行効率も大幅に向上します。これは非常に優れた方法であり、PHP の最適化でも広く使用されています。ただし、自作の PHP ビジネス開発には、拡張開発に時間がかかる、要件が変わると修正が煩雑になる、書き方が悪いと Web サービスの安定性に影響を与える可能性があるなどの欠点も明らかです。 (たとえば、Apache のワーカー モードでは、マルチスレッド シナリオでハングすると、同じプロセス内の他の通常のサブスレッドに影響します。マルチスレッド Web モードの場合、書き込み拡張機能はスレッド セーフをサポートする必要があります。 )
- 拡張 PHP バージョンをアップグレードする場合、追加の互換性作業が必要になる場合があります。
- 人事異動後の維持費や引き継ぎ費も比較的高額です。
- 実際、第一線のインターネット企業の間では、より一般的なソリューションは、PHP 拡張機能を追加するのではなく、C/C を使用して独自にサービス サーバーを作成し、PHP がサービスと通信することです。ビジネス処理は、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 と PHP7 の間のギャップはそれほど大きくありません。テスト シナリオとして WordPress オープンソース ブログ ホームページを作成した結果では、 、現在のギャップは明らかではありません。
ただし、PHP7 はまだ開発中であるため、利用可能な技術ソリューションから判断すると、現在の HHVM の方がわずかに優れています。ただし、HHVM の展開とアプリケーションにはいくつかの問題があります。
サービスの展開は複雑で、一定のメンテナンス費用がかかります。
- PHP ネイティブ コードは完全にはサポートされていないため、PHP 拡張機能にも適切な互換性が必要です。
- HHVM は新しい仮想マシンであるため、長時間実行するとメモリ リークが発生する可能性があります。 (一流のインターネット企業がこのテクノロジーを適用する場合、自社でパッチを適用することでメモリ リークを解決していると言われています)
PHP7 のパフォーマンスの革新
PHP が長い間批判されてきたパフォーマンスの問題は、このバージョンでは大幅に改善されます。途中のバージョンには PHP6 はありません。このバージョンにはプロジェクトがあり、その後ほとんどの機能は 5.x バージョンで実装されたと言われています。混乱を避けるため、次のメジャー バージョンは直接 PHP7 になります。 。 (数年前には、PHP6 に関する本も見かけました。)
1. PHP7 の紹介
PHP7 の正式版ではありますが、は 2015 年 10 月までリリースされない可能性がありますが、テスト版は来年 6 月に公開され、その後 3 ~ 4 か月の品質保証が提供される予定です。
PHP コミュニティのプロジェクト計画は次のとおりです:
プロジェクトがまだ開発中であるため 表からわかる機能の説明は比較的曖昧です。他にも間違いなく他にも機能がありますが、まだ発表されていないだけです。以下は PHP コミュニティからのものです。PHP7 は開発中のプロジェクトであるため、以下は正確ではない可能性がありますが、参照することを妨げるものではありません。
- PHPNG (次世代 PHP、次世代 PHP)、Zend 実行エンジン自体のさまざまなパフォーマンスの最適化。その中には、JIT が Zend Opcache コンポーネントに実装されている場合があります。
- AST (抽象構文ツリー、抽象構文ツリー) は、PHP コンパイル プロセスにミドルウェアを導入して、インタープリターからオペコードを直接吐き出す方法を置き換えることを目的としています。インタプリタとコンパイラを分離すると、多くのハック コードが削減され、同時に実装の理解と保守が容易になります。
- 統一変数構文 (統一変数構文) は、内部的に一貫した完全な変数構文を導入し、PHP パーサーがさまざまなタイプの変数をより完全にサポートできるようにします。変数 $$a など、いくつかの変数の使用法を調整する必要があります。
- 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 の変数は、カジュアルかつエレガントで、あらゆるものを包含するように設計されています。
実際、これは深刻な問題だと考える人もいます。「弱い型付け」に対する批判は、おおよそ次のとおりです:
- 「厳密な」言語では、通常、それは事前定義されています。変数の型は最初から最後まで固定であり、使用範囲も固定です。 PHP 変数に関しては、通常は名前しか確認できず、ほとんどの型は事前定義できず、自由に変更できます。 (メモリ割り当ての管理は容易ではありません)
- PHP は、弱い型の機能と互換性を持たせるために、型判定、型変換、格納メソッドなどを含む互換性のあるコードを多数実装する必要があります。言語の内部の複雑さが増加します。 (実行効率が低い)
- 変数の型を制御できない 実行プロセス中に多数の「暗黙的な型変換」が行われるため、予期しない結果が発生しやすくなります。 (ここで、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











php7.0 に mongo 拡張機能をインストールする方法: 1. mongodb ユーザー グループとユーザーを作成します; 2. mongodb ソース コード パッケージをダウンロードし、ソース コード パッケージを "/usr/local/src/" ディレクトリに配置します; 3. 「src/」ディレクトリに入ります; 4. ソースコードパッケージを解凍します; 5. mongodb ファイルディレクトリを作成します; 6. ファイルを「mongodb/」ディレクトリにコピーします; 7. mongodb 設定ファイルを作成して設定を変更します。

PHP 7.0 でインストールされているプラグインが表示されない問題を解決するには: プラグインの設定を確認し、プラグインを有効にします。 PHP を再起動して、構成の変更を適用します。プラグイン ファイルの権限をチェックして、それらが正しいことを確認します。不足している依存関係をインストールして、プラグインが適切に機能することを確認します。他のすべての手順が失敗した場合は、PHP を再構築します。他に考えられる原因としては、プラグインのバージョンに互換性がない、間違ったバージョンをロードしている、PHP 構成の問題などが挙げられます。

php5 では、fsockopen() 関数を使用して TCP ポートを検出できます。この機能を使用して、ネットワーク接続を開き、ネットワーク通信を実行できます。ただし、php7 では、fsockopen() 関数でポートを開けない、サーバーに接続できないなどの問題が発生する可能性があります。この問題を解決するには、socket_create() 関数とsocket_connect() 関数を使用して TCP ポートを検出します。

PHP サーバー環境の一般的な解決策には、正しい PHP バージョンがインストールされていること、および関連ファイルがモジュール ディレクトリにコピーされていることを確認することが含まれます。 SELinux を一時的または永続的に無効にします。 PHP.ini をチェックして構成し、必要な拡張機能が追加され、正しく設定されていることを確認します。 PHP-FPM サービスを開始または再起動します。 DNS 設定に解決の問題がないか確認してください。

php7.0 をインストールおよび展開する方法: 1. PHP 公式 Web サイトにアクセスして、ローカル システムに対応するインストール バージョンをダウンロードします; 2. ダウンロードした zip ファイルを指定したディレクトリに解凍します; 3. コマンド ライン ウィンドウを開いて、次のリンクに移動します。 「E:\php7」ディレクトリ 「php -v」コマンドを実行するだけです。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

PHP7 と比較すると、PHP8 にはパフォーマンス、新機能と構文の改善、型システム、エラー処理と拡張機能の点でいくつかの利点と改善点があります。ただし、どのバージョンを使用するかは、特定のニーズとプロジェクトの状況によって異なります。詳細な紹介: 1. パフォーマンスの向上、PHP8 はコードの実行速度を向上できるジャストインタイム (JIT) コンパイラーを導入します; 2. 新機能と構文の改善、PHP8 は名前付きパラメーターとオプションのパラメーターの宣言をサポートします。関数の作成 呼び出しがより柔軟になり、匿名クラス、プロパティの型宣言などが導入されています。
