これが呼ばれるたびに、ユーザーオブジェクトはデータベースオブジェクトを「注入」して作成されます。
PHPで利用できるいくつかのよく知られている(そしてあまり知られていない)容器があります:
Pimpleの単語:Pimpleは依存関係噴射コンテナとして宣伝されていますが、コンテナからオブジェクトを取得することは常に同じインスタンスを返します。テストされます すべてのコンテナはさまざまな機能をサポートしていますが、このベンチマークは、依存噴射容器に必要な基本的な機能をカバーします。つまり、オブジェクトを作成し、必要な場所で依存関係を注入します。
依存噴射のどの側面が測定されますか?
このテストでは、各コンテナを使用して、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>
Symfonyはすべてのテストで非常に中間地域にありますが、Auraと同様に、サポートタイプのヒントされたパラメーターではないため、はるかに困難なタスクです。有名なプロジェクトからコンテナを探している場合は、パフォーマンスが重要な場合は、Symfonyが選択のコンテナでなければなりません。
それは、純粋なパフォーマンスがあなたがその後のものである場合、その後のサイコロとオーラは、Ornoが非常に近いという明確な勝者です。ただし、サイコロ、オーラ、オーノのパフォーマンスの違いが実際のアプリケーションでは無視できるように、構成の構文とそれぞれの機能を調べる価値があります。 テスト用のすべてのコードはGitHubで入手できます。注:githubリポジトリには、プロジェクトにコンポーザーを使用するのではなく、テストされたライブラリのコピーが含まれています。これは、テストした正確なバージョンでコードを実行して同じ結果を取得できるようにするためです。 > PHP依存関係噴射コンテナパフォーマンスベンチマークに関するよくある質問(FAQ)PHP依存関係噴射コンテナパフォーマンスベンチマークの重要性は何ですか? 依存関係噴射コンテナパフォーマンスベンチマークは、異なる依存関係噴射コンテナの効率と速度を理解する上で重要です。これらのベンチマークは、さまざまなコンテナの比較分析を提供し、開発者が特定のニーズに基づいて使用するコンテナについて情報に基づいた決定を下すのに役立ちます。彼らは、PHPアプリケーションのパフォーマンスを最適化する際の重要な要因であるメモリの使用と時間消費の観点から、各コンテナのパフォーマンスに関する洞察を提供します。 > PHPの依存関係注射(DI)は、ゆるい結合、テスト可能性の向上、およびコードの再利用性の向上を促進することにより、コードの品質を向上させます。依存関係を注入することにより、コンポーネントはより独立し、コードの変更とテストが容易になります。また、各クラスがすべきことのみを行い、よりクリーンで保守可能なコードにつながるため、単一の責任の原則を奨励します。PHPにおける異なるタイプの依存性注入は
PHPには、コンストラクターインジェクション、セッター注入、界面注入の3つの主要なタイプがあります。コンストラクターインジェクションは、クラスコンストラクターを介して依存関係が提供される場所です。セッターインジェクションには、メソッドを介して依存関係を提供することが含まれます。インターフェイスインジェクションでは、依存関係を注入するインターフェイスを実装するために従属クラスが必要です。コンテナ、アプリケーション内のサービスまたはオブジェクトのインスタンス化と構成を管理します。依存関係のインスタンスの作成と返却を担当する工場として機能します。また、共有インスタンスを管理し、共有サービスが要求されるたびに単一のインスタンスが返されるようにします。コンテナ、使いやすさ、パフォーマンス、コミュニティサポート、プロジェクトとの互換性などの要因を考慮してください。パフォーマンスは特に重要であり、PHP依存噴射コンテナパフォーマンスベンチマークが役立つ場所です。さまざまなコンテナのパフォーマンスの比較分析を提供し、情報に基づいた決定を下すのに役立ちます。クラスの依存関係。これにより、テスト中に依存関係をock笑またはスタブを張ることができ、クラスを単独でテストすることができます。また、予測可能な応答を提供する模擬依存関係を挿入し、テストをより信頼性が高く書きやすくするため、ユニットテストを簡単に記述することができます。
はい、そのサイズや複雑さに関係なく、任意のPHPプロジェクトで依存関係を使用できます。これは、コードの再利用可能性、モジュール性、およびテスト可能性を促進する設計パターンであり、PHP開発者にとって貴重なツールになります。追加の抽象化レイヤーのためにわずかなオーバーヘッドを導入できます。アプリケーションのパフォーマンスへの影響は一般に無視できます。コードの品質、テスト可能性、保守性の改善の利点は、しばしばマイナーなパフォーマンスコストを上回ります。依存噴射は、特に依存関係の反転原理(DIP)に密接に関連しています。 DIPは、高レベルのモジュールは低レベルのモジュールに依存してはならないが、どちらも抽象化に依存する必要があると述べています。依存関係の噴射により、コンクリートクラスではなく、インターフェイスまたは抽象クラスとして依存関係を注入できるようにすることでこれを可能にします。単一のPHPプロジェクトで複数の依存関係噴射コンテナを使用することができますが、通常はお勧めしません。複数のコンテナを使用すると、管理と理解が困難なコードにつながる可能性があります。通常、プロジェクトのニーズに最適なコンテナを1つ選択し、それに固執することをお勧めします。
以上がPHP依存関係噴射コンテナパフォーマンスベンチマークの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。