ホームページ >バックエンド開発 >PHPチュートリアル >Baiduエンジニアが語るPHP機能の実装原理と性能分析(3)_PHPチュートリアル
この記事では主にBaiduエンジニアが語るPHP機能の実装原理と性能分析(3)を紹介しています。よく使用される PHP 関数の概要と提案を作成しました。必要な友人はそれを参照できます
よく使われるPHP関数の実装と紹介
数える
Countはよく使う関数で、その機能は配列の長さを返すことです。
count関数の複雑さは何ですか? よく言われるのは、count関数は配列全体を走査して要素の数を見つけるので、複雑さはO(n)です。これが実際の状況でしょうか? count の実装に戻りましょう。配列の count 操作の最終パスは zif_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
これら 2 つは、-_ を除く文字列内のすべての英数字以外の文字が、その後に続く 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. 特に必要がない限り、パラメータを渡すときは参照渡しではなく値渡しを使用することをお勧めします。もちろん、パラメーターが大きな配列であり、変更する必要がある場合は、参照渡しを検討できます。
について説明します。