ホームページ  >  記事  >  バックエンド開発  >  phpが遅いのはなぜですか?

phpが遅いのはなぜですか?

(*-*)浩
(*-*)浩オリジナル
2019-09-16 15:47:202734ブラウズ

PHP が遅いのはなぜですか?

phpが遅いのはなぜですか?

PHP は C/C レベルの言語に比べて遅いです。実際、PHP 言語の元々の設計は次のとおりです。計算負荷の高いアプリケーション シナリオを解決するためには使用されません。 PHP は開発効率を高めるために実行効率を犠牲にしていることが大まかに理解できます。 (推奨される学習: PHP プログラミングの入門から熟練度まで )

PHP の大きな特徴は弱い型の特徴であること、つまり変数を定義できることを私たちは知っています。自由に、そしてそれを自由にさまざまなタイプのデータに割り当てます。 C 言語の int 整数を例に挙げると:

int num = 200;//通常是4字节

ただし、PHP が同じ変数を定義する場合、実際に対応するストレージ構造は次のとおりです:

この構造は多くの領域を占有します。 C の変数よりも多くのメモリを必要とします。PHP では次のように定義されています:

$a = 200;//这变量将实际占用对比C变量很多倍的存储空间。

実際、PHP では、どのような種類のデータが格納されているかに関係なく、上記の "Tong Kill" の構造実装。 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 言語の一部である PHP 言語構造 (isset、echo など) です。基本的には関数ではありません)。

そして、高速なものは PHP のネイティブ関数と拡張関数です。 Zend API に基づいた PHP 拡張機能、関数は C で実装されており、実行効率は C/Java と同程度です。

本当に遅いのは、PHP を通じて自分で作成したコードと関数です。たとえば、純粋な PHP で実装された比較的重いフレームワークを使用すると、フレームワーク自体に多くのモジュールが含まれるため、言語レベルでの実行効率が明らかに低下し、より多くのメモリを占有することになります。 (国産の Yaf フレームワークを拡張して実装しているため、純粋な PHP で書かれたフレームワークよりも実行効率が大幅に高速です)

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

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

拡張開発に時間がかかる、要件が変わると修正が煩雑になる、書き方が悪いと Web サービスの安定性に影響を与える可能性があるなどの欠点も明らかです。 (たとえば、Apache のワーカー モードでは、マルチスレッド シナリオでハングすると、同じプロセス内の他の通常のサブスレッドに影響します。マルチスレッド Web モードの場合、書き込み拡張機能はスレッド セーフをサポートする必要があります。 )

拡張 PHP バージョンをアップグレードする場合、追加の互換性作業が必要になる場合があります。

人事異動後の維持費や引き継ぎ費も比較的高額です。

実際、第一線のインターネット企業の間では、より一般的なソリューションは、PHP 拡張を追加するのではなく、C/C を使用して独自にサービス サーバーを作成し、PHP がソケットを介してサービス サーバーと通信することです。ビジネス処理を完了するためのものであり、PHP 自体をビジネスに結び付けるものではありません。

ただし、Web サービスのパフォーマンスのボトルネックのほとんどは、ネットワーク送信や他のサービス サーバー (MySQL など) に時間がかかることにあります。PHP の実行にかかる時間は、非常に小さな影響を及ぼします。かかる時間は全体に占める割合が大きいため、ビジネスの観点から見ると、その影響は明らかではない可能性があります。

以上がphpが遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。