検索
ホームページバックエンド開発PHPチュートリアルBaiduエンジニアが語るPHP機能の実装原理と性能分析(3)_PHPチュートリアル

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. 特に必要がない限り、パラメータを渡すときは参照渡しではなく値渡しを使用することをお勧めします。もちろん、パラメーターが大きな配列であり、変更する必要がある場合は、参照渡しを検討できます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1000086.html技術記事 Baidu エンジニアが語る PHP 機能の実装原理と性能分析 (3) この記事では、Baidu エンジニアが語る PHP 機能の実装原理と性能分析 (3) を中心に紹介しています この記事では、よく使われる ph...
について説明します。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPアプリケーションをより速くする方法PHPアプリケーションをより速くする方法May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster、followthesesteps:1)useopcodecachinglikeopcacheTostoredscriptbytecode.2)最小化abasequeriesecachingingindexing.3)leveragephp7機能forbettercodeefficiency.4)

PHP依存性インジェクション:コードのテスト可能性を改善しますPHP依存性インジェクション:コードのテスト可能性を改善しますMay 12, 2025 am 12:03 AM

依存性注入(DI)は、明示的に推移的な依存関係によりPHPコードのテスト可能性を大幅に改善します。 1)DI分離クラスと特定の実装により、テストとメンテナンスが柔軟になります。 2)3つのタイプのうち、コンストラクターは、状態を一貫性に保つために明示的な式依存性を注入します。 3)DIコンテナを使用して複雑な依存関係を管理し、コードの品質と開発効率を向上させます。

PHPパフォーマンスの最適化:データベースクエリの最適化PHPパフォーマンスの最適化:データベースクエリの最適化May 12, 2025 am 12:02 AM

DatabaseQueryoptimizationInpholvesseveralstrategESTOEnhancePerformance.1)selectonlynlynlyndorycolumnStoredatedataTransfer.2)useindexingtospeedupdataretrieval.3)revenmecrycachingtostoreres sultsoffrequent queries.4)

簡単なガイド:PHPスクリプトで電子メールを送信します簡単なガイド:PHPスクリプトで電子メールを送信しますMay 12, 2025 am 12:02 AM

phpisusededemingemailsduetoitsbuilt-inmail()functionandsupportiveLibrarieslikephpmailerandswiftmailer.1)usethemail()functionforbasicemails、butithaslimitations.2)emploadforadvancedfeatureSlikelikelivableabableabuses.3)雇用

PHPパフォーマンス:ボトルネックの識別と修正PHPパフォーマンス:ボトルネックの識別と修正May 11, 2025 am 12:13 AM

PHPパフォーマンスボトルネックは、次の手順で解決できます。1)パフォーマンス分析にXdebugまたはBlackfireを使用して問題を見つける。 2)データベースクエリを最適化し、APCUなどのキャッシュを使用します。 3)array_filterなどの効率的な関数を使用して、配列操作を最適化します。 4)bytecodeキャッシュ用のopcacheを構成します。 5)HTTP要求の削減や写真の最適化など、フロントエンドを最適化します。 6)パフォーマンスを継続的に監視および最適化します。これらの方法により、PHPアプリケーションのパフォーマンスを大幅に改善できます。

PHPの依存関係注射:簡単な要約PHPの依存関係注射:簡単な要約May 11, 2025 am 12:09 AM

依存関係(di)inphpisadesignpatternativats anducesclassodulencies、拡張測定性、テスト可能性、および維持可能性。

PHPパフォーマンスの向上:キャッシュ戦略と技術PHPパフォーマンスの向上:キャッシュ戦略と技術May 11, 2025 am 12:08 AM

cachingemprovesppperformancebystring of computationsorquickretrieval、還元装置の削減は、reducingerloadendenhancersponseTimes.efcectivestrategiesInclude:1)opcodecaching、compiledphpscriptsinmemorytoskipcompilation;

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

DVWA

DVWA

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

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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