よく使われる PHP 関数の実装と紹介
カウント
count はよく使用する関数で、その機能は配列の長さを返すことです。
count関数の複雑さはどれくらいですか? よく言われるのは、count 関数は配列全体を走査して要素の数を見つけるため、複雑さは O(n) になるということです。では、これは実際にそうなのでしょうか? count の実装に戻りましょう。配列の count 操作では、関数の最終パスは zif_count->php_count_recursive-> であり、zend_hash_num_elements の動作は return であることがわかります。 ht->nNumOfElements。これは O(n) 操作ではなく O(1) 操作であることがわかります。実際、配列は PHP の下部にある hash_table であり、ハッシュ テーブルの場合、現在の要素の数を記録する特別な要素 nNumOfElements が zend にあるため、一般的なカウントの場合、この値が実際に直接返されます。このことから、count の複雑さは O(1) であり、特定の配列のサイズとは関係がないという結論が得られます。
非配列型変数の count の動作はどうなりますか?未設定の変数には 0 を返しますが、int、double、string などの場合は 1 を返します
ストラレン
Strlen は文字列の長さを返すために使用されます。それでは、彼の実装原則は何でしょうか? strlen が C の O(n) 関数であることは誰もが知っています。この関数は、文字列に遭遇するまで順番に文字列を走査します。
isset と array_key_exists
これら 2 つの関数の最も一般的な使用法は、キーが配列内に存在するかどうかを確認することです。ただし、前者は、変数が設定されているかどうかを判断するために使用することもできます。前述したように、isset は実関数ではないため、効率は後者よりもはるかに高くなります。 array_key_exists の代わりにこれを使用することをお勧めします。
array_push と array[]
どちらも配列の末尾に要素を追加します。違いは、前者は一度に複数のものをプッシュできることです。それらの最大の違いは、一方が関数であり、もう一方が言語構造であるため、後者の方が効率的であることです。したがって、通常に要素を追加するだけの場合は、配列 [] を使用することをお勧めします。
ランドとmt_rand
どちらも乱数を生成する機能を提供します。前者は libc 標準 rand を使用します。後者は、乱数生成器としてメルセンヌ ツイスターの既知の機能を使用しており、libc が提供する rand() よりも平均して 4 倍高速に乱数値を生成できます。したがって、より高いパフォーマンス要件がある場合は、前者の代わりに mt_rand の使用を検討できます。 C では、rand が疑似乱数を生成することは誰もが知っていますが、指定されたシードを表示するには srand を使用する必要があります。ただし、php では、rand はデフォルトで srand を 1 回呼び出します。通常の状況では、自分で明示的に呼び出す必要はありません。特別な状況で srand を呼び出す必要がある場合は、組み合わせて呼び出す必要があることに注意してください。つまり、srand は rand に対応し、mt_srand は srand に対応します。これらを混合してはなりません。混合しないと無効になります。
並べ替えと並べ替え
どちらもソートに使用されます。違いは、前者は C の qsort や C++ の sort と同様にソート戦略を指定できることです。ソートに関しては、どちらも標準のクイックソートを使用して実装されています。ソート要件がある場合は、特別な事情がない限り、PHP が提供するこれらのメソッドを呼び出すだけで済み、自分で再実装する必要はありません。より低い。その理由は、ユーザー関数と組み込み関数の以前の分析と比較でわかります。
urlencode と rawurlencode
これらは両方とも URL エンコードに使用され、-_ を除く文字列内のすべての非英数字はパーセント記号 (%) とその後に続く 2 つの 16 進数に置き換えられます。 2 つの唯一の違いは、スペースの場合、urlencode はスペースを + としてエンコードするのに対し、rawurlencode はスペースを %20 としてエンコードすることです。一般に、検索エンジンを除いて、スペースを %20 としてエンコードすることが戦略となります。したがって、主に後者が使用されます。エンコード シリーズとデコード シリーズを一緒に使用する必要があることに注意してください。
strcmpシリーズの機能 この一連の関数には strcmp、strncmp、strcasecmp、strncasecmp があり、C の関数と同じです。ただし、php 文字列が許可されているため、違いがあります。
is_int と is_numeric
これら 2 つの関数の機能は似ていますが、まったく同じではありません。使用する場合は、その違いに注意する必要があります。 Is_int: 変数の型が整数型であるかどうかを判断します。PHP 変数には特殊なフィールド表現型があるため、この型を直接判断できます。 Is_numeric: 変数が整数であるかどうかを判断します。つまり、true を返す整数変数に加えて、文字列変数の場合、「1234」、「1e4」などの形式の場合も true と判断されます。 。このとき、文字列をたどって判定します。
まとめと提案
概要:
機能実装の原理分析とパフォーマンステストを通じて、次の結論をまとめました
1. Php の関数呼び出しのオーバーヘッドは比較的大きくなります。
2. 関数関連の情報は大きな hash_table に格納され、呼び出されるたびに関数名がハッシュ テーブル内で検索されるため、関数名の長さもパフォーマンスに一定の影響を与えます。
3. 関数戻り参照には実質的な意味はありません
4. 組み込みの PHP 関数のパフォーマンスは、特に文字列操作の場合、ユーザー関数のパフォーマンスよりもはるかに高くなります。
5. クラスメソッド、通常の関数、静的メソッドの効率はほぼ同じで、大きな違いはありません
6. 空の関数呼び出しの影響を除けば、組み込み関数と同じ関数の C 関数のパフォーマンスは基本的に同じです。
7。 すべてのパラメータ転送は参照カウントを使用した浅いコピーであり、コストはほとんどかかりません。
8. 関数の数がパフォーマンスに与える影響はほとんど無視できます
おすすめ:
そのため、php関数の使用については、次のようないくつかの提案があります
1. 関数は組み込み関数で完成させることができます。php 関数を自分で記述する代わりに、組み込み関数を使用してみてください。
2. 特定の関数に高いパフォーマンス要件がある場合は、拡張機能を使用して実装することを検討できます。
3. Php 関数呼び出しは高価であるため、過度にカプセル化しないでください。一部の関数を何度も呼び出す必要があり、1 行または 2 行のコードだけで実装できる場合は、呼び出しをカプセル化しないことをお勧めします。
4. さまざまな設計パターンにこだわりすぎないでください。前の記事で説明したように、過度のカプセル化はパフォーマンスの低下を引き起こします。両者の間には考慮する必要のあるトレードオフがあります。 Php には独自の特性があり、Java モデルをあまり真似しないでください。
5. 関数はあまり深く入れ子にしないでください。再帰は注意して使用する必要があります。
6. 擬似関数は性能が高いため、同じ関数を実装する場合は優先されます。たとえば、array_key_exists の代わりに isset を使用します
7。 関数から参照を返すことはあまり意味がなく、実際的な効果はありません。考慮しないことをお勧めします。
8. クラス メンバー メソッドは通常の関数と比べて効率が低いため、パフォーマンスの低下を心配する必要はありません。可読性とセキュリティが向上する、より静的なメソッドを検討することをお勧めします。
9. 特別な必要がない限り、パラメータを渡すときは参照渡しではなく値渡しを使用することをお勧めします。もちろん、パラメーターが大きな配列であり、変更する必要がある場合は、参照渡しを検討できます。