Baiduエンジニアが語るPHP関数の実装原理と性能分析(2)、php関数_PHPチュートリアル
Baidu エンジニアが語る PHP 関数の実装原理とパフォーマンス分析 (2)、PHP 関数
クラスメソッド
クラスメソッドの実行原理はユーザー関数と同じで、オペコードに変換されて順次呼び出されます。クラスの実装は、データ構造 zend_class_entry を使用して zend によって実装されます。この構造には、クラスに関連するいくつかの基本情報が格納されます。このエントリは、PHP のコンパイル時に処理されます。
zend_function の共通部分には、現在のメソッドに対応するクラスの zend_class_entry を指すscopeというメンバーがあります。 PHP におけるオブジェクト指向の実装については、ここでは詳しく説明しません。今後、PHP におけるオブジェクト指向の実装原理について詳しく説明する記事を書く予定です。関数に関する限り、メソッドの実装原理は関数の実装原理とまったく同じであり、そのパフォーマンスは理論的には同様です。詳細なパフォーマンスの比較は後で行います。
パフォーマンスの比較
関数名の長さがパフォーマンスに及ぼす影響
》》テスト方法 名前の長さが 1、2、4、8、16 の関数を比較し、1 秒あたりの実行可能回数をテストして比較し、関数名の長さがパフォーマンスに与える影響を確認します
》》テスト結果は以下の通りです
》》結果分析
図からわかるように、関数名の長さは依然としてパフォーマンスに一定の影響を与えます。長さ 1 の関数と長さ 16 の空の関数呼び出しでは、パフォーマンスに 1 倍の違いがあります。ソース コードを分析することで理由を見つけるのは難しくありません。関数が呼び出されるとき、zend はまずグローバル function_table (ハッシュ テーブル) 内の関数名を通じて関連情報を照会します。必然的に、名前が長ければ長いほど、クエリにかかる時間も長くなります。 したがって、実際にプログラムを作成する際には、複数回呼び出される関数名は長くなりすぎないようにすることをお勧めします。
関数名の長さはパフォーマンスに一定の影響を与えますが、具体的にはどのくらいの長さなのでしょうか?この問題は、実際の状況に基づいて検討する必要がありますが、関数自体が比較的複雑な場合は、全体のパフォーマンスに大きな影響を与えることはありません。 1 つの提案は、何度も呼び出され、比較的単純な機能を持つ関数には、簡潔で簡潔な名前を付けることです。
関数の数がパフォーマンスに与える影響
》》テスト方法
次の 3 つの環境で関数呼び出しテストを実行し、結果を分析します。 1. プログラムに関数が 1 つだけ含まれている 2. プログラムに関数が 100 個含まれている 3. プログラムに関数が 1000 個含まれている。これら 3 つの状況で 1 秒あたりに呼び出せる関数の数をテストします
》》テスト結果は以下の通りです
》》結果分析
テスト結果から、これら 3 つのケースのパフォーマンスはほぼ同じであることがわかります。関数の数が増加しても、パフォーマンスの低下は最小限であり、無視できます。実装原理の分析から、いくつかの実装の唯一の違いは機能取得部分です。前述したように、すべての関数はハッシュ テーブルに配置され、検索効率は数値が異なっても O(1) に近いはずなので、パフォーマンスの差は大きくありません。
さまざまな種類の関数呼び出しのコスト
》》テスト方法
ユーザー関数、クラス メソッド、静的メソッド、組み込み関数のいずれかを選択します。関数自体は何も行わず、主に空の関数呼び出しの消費をテストします。テスト結果は 1 秒あたりの実行数です。テスト中に他の影響を取り除くため、すべての関数名は同じ長さになります
。
》》テスト結果は以下の通りです
》》結果分析
テスト結果から、ユーザー自身が作成した PHP 関数の場合、関数の種類に関係なく、その効率はほぼ同じで、すべて 280w/s 程度であることがわかります。予想通り、エアコンでも内蔵機能の効率ははるかに高く、780w/sと従来の3倍に達します。組み込み関数呼び出しのオーバーヘッドは、ユーザー関数のオーバーヘッドよりもはるかに低いことがわかります。前述の原理分析から、主なギャップはシンボル テーブルの初期化やユーザー関数の呼び出し時のパラメーターの受信などの操作にあることがわかります。
組み込み関数とユーザー関数のパフォーマンス比較
》》試験方法
ここでは、組み込み関数とユーザー関数のパフォーマンスを比較するために、よく使用される関数をいくつか選択し、PHP 関数を使用して同じ関数を実装してパフォーマンスを比較します。テストでは、文字列、数学、配列のそれぞれから代表的なものを選択して比較しました。これらの関数は、文字列インターセプト (substr)、10 進数から 2 進数への変換 (decbin)、最小値 (min)、およびすべてのキーです。配列 (array_keys)。
》》テスト結果は以下の通りです
》》結果分析
テスト結果から、予想どおり、組み込み関数の全体的なパフォーマンスが通常のユーザー関数よりもはるかに高いことがわかります。特に文字列操作を含む関数の場合、そのギャップは 1 桁に達します。したがって、関数を使用する際の 1 つの原則は、特定の関数に対応する組み込み関数がある場合は、PHP 関数を自分で作成する代わりに、それを使用することです。多数の文字列操作を伴う一部の関数では、パフォーマンスを向上させるために、拡張機能の使用を検討できます。たとえば、一般的なリッチ テキスト フィルタリングなどです。
C関数の性能との比較
》》試験方法
比較対象となる関数は文字列演算と算術演算それぞれ 3 つずつ選択し、拡張機能を使用して PHP を実装しました。 3 つの関数は、単純な 1 回限りの算術演算、文字列比較、および複数の算術演算です。独自の 2 種類の関数に加えて、関数の空調オーバーヘッドを取り除いた後のパフォーマンスもテストします。一方で、2 つの関数 (C および PHP 組み込み) のパフォーマンスの違いを比較します。一方、空調機能の消費テストポイント:10万回の動作にかかる消費時間を確認します
》》テスト結果は以下の通りです
》》結果分析
組み込み関数と C 関数のオーバーヘッドの差は、php 関数の調整の影響を除くと小さくなります。関数がますます複雑になるにつれて、両方のパフォーマンスは同じに近づきます。これは、前述の関数実装分析から簡単に証明できます。結局のところ、組み込み関数は C で実装されています。関数が複雑になればなるほど、C と PHP のパフォーマンスの差は小さくなります。C と比較すると、PHP 関数呼び出しのオーバーヘッドははるかに高くなりますが、単純な関数のパフォーマンスには依然として一定の影響があります。したがって、PHP の関数をあまり深くネストしたりカプセル化したりしないでください。
疑似関数とそのパフォーマンス
PHP には、標準的な関数の使用法である関数がいくつかありますが、その基礎となる実装は、上記の 3 つの関数のいずれにも属さず、別個のオペコードです。をここでは擬似関数または命令関数と呼びます。
上で述べたように、疑似関数は標準関数と同じように使用され、同じ特性を持つように見えます。ただし、それらが最終的に実行されるとき、それらは zend によって呼び出し用の対応する命令 (オペコード) に反映されるため、その実装は if、for、算術演算などの演算に近くなります。
》》phpの擬似関数
あるある
空
設定解除
評価
上記の紹介からもわかるように、疑似関数は命令に直接変換されて実行されるため、通常の関数に比べて関数呼び出しによるオーバーヘッドが 1 つ少なく、パフォーマンスが向上します。以下のテストで比較してみます。 Array_key_exists と isset は両方とも、配列内にキーが存在するかどうかを判断できます。そのパフォーマンスを見てみましょう。
図からわかるように、array_key_exists と比較すると isset のパフォーマンスが大幅に向上しており、基本的には前者の約 4 倍、空の関数呼び出しと比較しても約 1 倍のパフォーマンスが向上しています。これは、PHP 関数呼び出しのオーバーヘッドがまだ比較的大きいことも証明しています。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

WebStorm Mac版
便利なJavaScript開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

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