Baiduエンジニアが語るPHP機能の実装原理と性能分析(3)
この記事では主に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. 特に必要がない限り、パラメータを渡すときは参照渡しではなく値渡しを使用することをお勧めします。もちろん、パラメーターが大きな配列であり、変更する必要がある場合は、参照渡しを検討できます。
について説明します。
php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ホットトピック



