PHP依存関係噴射コンテナパフォーマンスベンチマーク
キーテイクアウト
- 依存関係噴射コンテナ(DIC)は、より大きなPHPアプリケーションとフレームワークでコードベースを維持するための重要なツールですが、パフォーマンスに影響を与える可能性があります。 PHPの有名なDICには、PHP-DI、SymfonyDependencyInjection、Zenddi、Ornodi、Dice、およびAura.di. が含まれます。 DICのパフォーマンスは、実行時間、メモリ使用量、および含まれるファイルの数の観点から測定されます。最後のメトリックは、アプリケーションの全体的な重みに大きく影響する可能性があるため、特に重要です。
- テスト済みの容器の中で、サイコロ、オーラ、オルノの中で最速で、サイコロは全体的に最速でした。 PHP-DIは、ユニークな機能を持っているにもかかわらず、パフォーマンスが大幅にヒットしました。 Symfonyは、設定がより困難ですが、中央で実行され、有名なプロジェクトからコンテナを探している人にとっては好ましい選択となります。 パフォーマンスの違いにもかかわらず、DICの選択は構成の構文と機能も考慮する必要があります。サイコロ、オーラ、Ornoのパフォーマンスの違いは、実際のアプリケーションではごくわずかです。したがって、開発者は、どのような作業を好むかに基づいて選択する必要があります。
- ほとんどのフレームワークと大規模なPHPアプリケーションは、よりメンテナンス可能なコードベースの目標を持って依存関係噴射コンテナを使用します。ただし、これはパフォーマンスに影響を与える可能性があります。読み込み時間が重要であるため、サイトを迅速に保つことは相変わらず重要です。今日は、相対的なパフォーマンスがどのようなものかを確認するために、いくつかのPHP依存噴射容器をベンチマークします。
- コンセプトに不慣れな人のために、依存関係噴射コンテナは、オブジェクトツリーを自動的に構築するソフトウェアです。たとえば、データベースインスタンスを必要とするユーザーオブジェクトを検討してください。
これが呼ばれるたびに、ユーザーオブジェクトはデータベースオブジェクトを「注入」して作成されます。
PHPで利用できるいくつかのよく知られている(そしてあまり知られていない)容器があります:
- php-di、人気のあるdiコンテナ
- symfony -dependencyinjection、symfonyフレームワークによって提供される依存関係噴射コンテナ
- Zenddi Zend Framework によって提供される依存関係噴射コンテナ
- Ornodi、機能が限られているが、パフォーマンスを念頭に置いて開発されたあまり知られていないコンテナ
- ダイス、軽量であることに焦点を当てたもう1つのあまり知られていない容器。完全な開示、私はこのコンテナの著者ですが、この分析では完全に目的にほかなりません。 aura.di、最小限の機能を備えたかなり人気のある容器
Pimpleの単語:Pimpleは依存関係噴射コンテナとして宣伝されていますが、コンテナからオブジェクトを取得することは常に同じインスタンスを返します。テストされます すべてのコンテナはさまざまな機能をサポートしていますが、このベンチマークは、依存噴射容器に必要な基本的な機能をカバーします。つまり、オブジェクトを作成し、必要な場所で依存関係を注入します。
依存噴射のどの側面が測定されますか?
実行時間
- メモリの使用
- 含まれるファイルの数。これはパフォーマンスにほとんど影響を与えませんが、ライブラリがどれほど軽量でポータブルであるかを示す良い指標です。 DIの選択のためにプロジェクトで何百ものファイルを出荷する必要がある場合、それはあなた自身のアプリケーションの全体的な重みに大きな影響を与える可能性があります。
- 環境のテスト
- すべてのテストは、2014年7月7日の時点で、Arch Linux(3.15カーネル)、PHP 5.5.13、および各コンテナの最新バージョンを実行している同じマシンで実行されました。
提示されたすべての実行時間数は、最速よりも20%を超えているものを破棄した後、平均10回の実行です。
テスト1 - オブジェクトのインスタンスを作成このテストでは、各コンテナを使用して、10,000回のシンプルなオブジェクトを作成します
依存関係噴射コンテナがない場合、これは次のように記述されます。
テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddiご覧のとおり、ここには2つの明確なキャンプがあります。オーラ、サイコロ、オルノは、PHP-DI、Symfony、Zenddiの約10倍高速です。
<span>$user = new User(new Database());</span>
実行時間と同様に、中央のどこかにシムフニーが座っている2つの異なるグループがあります。
これは、各コンテナがどれほど軽量であるかを非常に示しており、メモリの使用の違いを説明するために何らかの形で進んでいます。 Zenddiで使用される多くのファイルは一般的なフレームワークファイルであるため、Zend Frameworkを使用している場合、Zenddiを使用すると、ファイルがアプリケーションの他の場所で再利用される可能性が高いため、Zenddiを使用すると同じメモリオーバーヘッドが発生しないことに注意してください。
同様に、PHP-DIは教義図書館に大きく依存しています。プロジェクトで教義を使用している場合、PHP-DIのメモリオーバーヘッドが削減されます。しかし、フレームワークスタックの一部であるにもかかわらず、Symfony -dependencyInjectionは完全にスタンドアロンであり、他のSymfonyプロジェクトからの依存関係なしに機能することを見るのは素晴らしいことです。
オーラ、サイコロ、ornoには外部依存関係がありません。これにより、ファイルがカウントされるのに役立ちます。テスト2 - オートローディングを無視
ファイルの読み込みはパフォーマンスに影響を与え、ZendとPHP-Diの両方がかなりの数のファイルをロードすると、最初にクラスの単一のインスタンスを作成することにより、自動装置時間を無視して同じテストが実施され、必要なクラスが測定する前に自動浸漬されたことを確認しました。時間。
これは、コンテナによって行われた内部キャッシングをトリガーした可能性もありますが、それを公正に保つために同じ処理が各容器に適用されました
同等のPHPコード:
テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi
<span>$user = new User(new Database());</span>
予想通り、メモリの使用は変更されず、オートローダーの時間が測定されていないため、パフォーマンスはわずかに優れています。ただし、これは、42ファイルを読み込むことでさえ、総実行時間に無視できる影響を与え、相対パフォーマンスが同じままであることを示しています。数十のファイルをロードすることは、PHP-DIとZenddiのパフォーマンスが比較的遅い原因ではありません。 🎜>
今後のすべてのテストは、自動装備時間を無視して、測定されているコンテナのパフォーマンスであることを確認します。
テスト3 - ディープオブジェクトグラフ
このテストは、コンテナにこのオブジェクトのセットを10,000回構築させることによって行われます。
テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi
注:テストコードを見ることでわかるように、Symfony、PHP-DI、およびAURAには、このテストを実行するために他のコンテナよりもかなり多くの構成コードが必要です。構成時間はテストに含まれていませんでした
zend、php-di、および程度は低いsymfonyはここで遅くなります。 Zendは37秒かかり、Diceが1秒未満で管理するタスクを実行します。確かに些細な違いではありません。繰り返しになりますが、Symfonyは有名な容器の中でリードしています。
メモリとファイルカウントは、他のテストで見たものと一致しています。
テスト4 - コンテナからサービスを取得
diコンテナも、アプリケーション全体で再利用されるサービスを保存および取得する必要があります。このテストでは、コンテナから単一のインスタンスを繰り返し取得します。
純粋なPHP相当:テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi
<span>$user = new User(new Database());</span>
これは、以前の結果に基づいて予想外です。 ZendとSymfonyを除くすべての容器は、わずか0.01が上位4つの結果を分離してほぼ等しくなります。 Symfonyはそれほど遅れていませんが、Zendは他のZendよりも10倍遅いです。
メモリの使用量とファイルの数は、実行時間全体で見たコンテナ間の同じ分割で予測可能になりつつあります。
テスト5 - サービスを挿入
最終テストは、オブジェクトをどれだけ迅速に構築できるかを確認し、サービスを注入することです。これには、形式が表示されます:
テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi
興味深いことに、オーラはこのテストでわずかなリードを奪いました。ただし、SymfonyとAuraには明示的な構成のいくつかの行が必要なため、他のコンテナが依存関係を自動的に解決するため、それはまったく似たようなテストではありません。コンテナを構成するのにかかった時間は、ベンチマークの一部ではありませんでした。
<span>$user = $container->get('User');</span>
結論
パフォーマンスだけでも、サイコロ、オーラ、オーノはすべて強力な競争相手であり、サイコロは全体的に最も速く、最終テストではオーラが最速です。 2つの異なるグループの違いは明らかですが、各コンテナの機能を比較するのは興味深いものです。あなたが期待するように、機能の数とパフォーマンスは完全に相関しません。 PHP-DIとDICEの両方にユニークな機能が含まれていますが、PHP-DIはそうするために大きなパフォーマンスヒットを取ります。オーラは高速ですが、多くの手動構成が必要であり、予想されるように非常に最小限の機能を持っていますが、サイコロとORNOのパフォーマンスは非常に似ていますが、構成するためにははるかに少ないコードが必要です。Symfonyはすべてのテストで非常に中間地域にありますが、Auraと同様に、サポートタイプのヒントされたパラメーターではないため、はるかに困難なタスクです。有名なプロジェクトからコンテナを探している場合は、パフォーマンスが重要な場合は、Symfonyが選択のコンテナでなければなりません。
それは、純粋なパフォーマンスがあなたがその後のものである場合、その後のサイコロとオーラは、Ornoが非常に近いという明確な勝者です。ただし、サイコロ、オーラ、オーノのパフォーマンスの違いが実際のアプリケーションでは無視できるように、構成の構文とそれぞれの機能を調べる価値があります。 テスト用のすべてのコードはGitHubで入手できます。注:githubリポジトリには、プロジェクトにコンポーザーを使用するのではなく、テストされたライブラリのコピーが含まれています。これは、テストした正確なバージョンでコードを実行して同じ結果を取得できるようにするためです。 > PHP依存関係噴射コンテナパフォーマンスベンチマークに関するよくある質問(FAQ)PHP依存関係噴射コンテナパフォーマンスベンチマークの重要性は何ですか? 依存関係噴射コンテナパフォーマンスベンチマークは、異なる依存関係噴射コンテナの効率と速度を理解する上で重要です。これらのベンチマークは、さまざまなコンテナの比較分析を提供し、開発者が特定のニーズに基づいて使用するコンテナについて情報に基づいた決定を下すのに役立ちます。彼らは、PHPアプリケーションのパフォーマンスを最適化する際の重要な要因であるメモリの使用と時間消費の観点から、各コンテナのパフォーマンスに関する洞察を提供します。 > PHPの依存関係注射(DI)は、ゆるい結合、テスト可能性の向上、およびコードの再利用性の向上を促進することにより、コードの品質を向上させます。依存関係を注入することにより、コンポーネントはより独立し、コードの変更とテストが容易になります。また、各クラスがすべきことのみを行い、よりクリーンで保守可能なコードにつながるため、単一の責任の原則を奨励します。PHPにおける異なるタイプの依存性注入は
PHPには、コンストラクターインジェクション、セッター注入、界面注入の3つの主要なタイプがあります。コンストラクターインジェクションは、クラスコンストラクターを介して依存関係が提供される場所です。セッターインジェクションには、メソッドを介して依存関係を提供することが含まれます。インターフェイスインジェクションでは、依存関係を注入するインターフェイスを実装するために従属クラスが必要です。コンテナ、アプリケーション内のサービスまたはオブジェクトのインスタンス化と構成を管理します。依存関係のインスタンスの作成と返却を担当する工場として機能します。また、共有インスタンスを管理し、共有サービスが要求されるたびに単一のインスタンスが返されるようにします。コンテナ、使いやすさ、パフォーマンス、コミュニティサポート、プロジェクトとの互換性などの要因を考慮してください。パフォーマンスは特に重要であり、PHP依存噴射コンテナパフォーマンスベンチマークが役立つ場所です。さまざまなコンテナのパフォーマンスの比較分析を提供し、情報に基づいた決定を下すのに役立ちます。クラスの依存関係。これにより、テスト中に依存関係をock笑またはスタブを張ることができ、クラスを単独でテストすることができます。また、予測可能な応答を提供する模擬依存関係を挿入し、テストをより信頼性が高く書きやすくするため、ユニットテストを簡単に記述することができます。
はい、そのサイズや複雑さに関係なく、任意のPHPプロジェクトで依存関係を使用できます。これは、コードの再利用可能性、モジュール性、およびテスト可能性を促進する設計パターンであり、PHP開発者にとって貴重なツールになります。追加の抽象化レイヤーのためにわずかなオーバーヘッドを導入できます。アプリケーションのパフォーマンスへの影響は一般に無視できます。コードの品質、テスト可能性、保守性の改善の利点は、しばしばマイナーなパフォーマンスコストを上回ります。依存噴射は、PHPの固体原理にどのように関連していますか?
依存噴射は、特に依存関係の反転原理(DIP)に密接に関連しています。 DIPは、高レベルのモジュールは低レベルのモジュールに依存してはならないが、どちらも抽象化に依存する必要があると述べています。依存関係の噴射により、コンクリートクラスではなく、インターフェイスまたは抽象クラスとして依存関係を注入できるようにすることでこれを可能にします。単一のPHPプロジェクトで複数の依存関係噴射コンテナを使用することができますが、通常はお勧めしません。複数のコンテナを使用すると、管理と理解が困難なコードにつながる可能性があります。通常、プロジェクトのニーズに最適なコンテナを1つ選択し、それに固執することをお勧めします。
以上がPHP依存関係噴射コンテナパフォーマンスベンチマークの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

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

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。
