Baiduエンジニアが語るPHP関数の実装原理と性能解析(2)
この記事では主にBaiduエンジニアがPHP関数の実装原理と性能解析について語る(2)の記事です。比較、組み込み 必要な友達は、機能とユーザー機能のパフォーマンス比較を参照できます
クラスメソッド
クラスメソッドの実行原理はユーザー関数と同じで、これもオペコードに変換されて順次呼び出されます。クラスの実装は、データ構造 zend_class_entry を使用して zend によって実装されます。この構造には、クラスに関連するいくつかの基本情報が格納されます。このエントリは、PHP のコンパイル時に処理されます。
zend_functionのcommonにはscopeというメンバがあり、現在のメソッドに対応するクラスのzend_class_entryを指します。 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 は両方とも、配列内にキーが存在するかどうかを判断できます。そのパフォーマンスを見てみましょう。

。

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。

PHPでのオートローディングは、必要に応じてクラスファイルを自動的にロードし、メモリの使用を削減し、コード組織を強化することでパフォーマンスを向上させます。ベストプラクティスには、PSR-4の使用とコードを効果的に整理することが含まれます。

PHPストリームは、一貫したAPIを介したファイル、ネットワークソケット、圧縮形式などのリソースの処理を統合し、複雑さを抽象化し、コードの柔軟性と効率を高めます。

この記事では、PHPでファイルアップロードサイズの管理を管理し、2MBのデフォルト制限とPHP.ini設定を変更してそれを増やす方法に焦点を当てています。

この記事では、PHP 7.1で導入されたPHPのヌル可能なタイプについて説明し、変数またはパラメーターが指定されたタイプまたはnullのいずれかを可能にします。読みやすさの改善、タイプの安全性、明示的な意図などの利点を強調し、宣言する方法を説明します

この記事では、プログラミングのunset()とlink()関数の違いについて説明し、目的とユースケースに焦点を当てています。 unset()はメモリから変数を削除しますが、link()はファイルシステムからファイルを削除します。どちらもEFFECにとって重要です


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック









