ホームページ > バックエンド開発 > PHPチュートリアル > PHP依存関係噴射コンテナパフォーマンスベンチマーク

PHP依存関係噴射コンテナパフォーマンスベンチマーク

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-02-20 12:23:14
オリジナル
395 人が閲覧しました

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は依存関係噴射コンテナとして宣伝されていますが、コンテナからオブジェクトを取得することは常に同じインスタンスを返します。テストされます すべてのコンテナはさまざまな機能をサポートしていますが、このベンチマークは、依存噴射容器に必要な基本的な機能をカバーします。つまり、オブジェクトを作成し、必要な場所で依存関係を注入します。

依存噴射のどの側面が測定されますか?

実行時間

    メモリの使用
  1. 含まれるファイルの数。これはパフォーマンスにほとんど影響を与えませんが、ライブラリがどれほど軽量でポータブルであるかを示す良い指標です。 DIの選択のためにプロジェクトで何百ものファイルを出荷する必要がある場合、それはあなた自身のアプリケーションの全体的な重みに大きな影響を与える可能性があります。
  2. 環境のテスト
  3. すべてのテストは、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つの異なるグループがあります。

PHP依存関係噴射コンテナパフォーマンスベンチマーク

これは、各コンテナがどれほど軽量であるかを非常に示しており、メモリの使用の違いを説明するために何らかの形で進んでいます。 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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

PHP依存関係噴射コンテナパフォーマンスベンチマーク

PHP依存関係噴射コンテナパフォーマンスベンチマーク予想通り、メモリの使用は変更されず、オートローダーの時間が測定されていないため、パフォーマンスはわずかに優れています。ただし、これは、42ファイルを読み込むことでさえ、総実行時間に無視できる影響を与え、相対パフォーマンスが同じままであることを示しています。数十のファイルをロードすることは、PHP-DIとZenddiのパフォーマンスが比較的遅い原因ではありません。 🎜>

ロードファイルのオーバーヘッドを無視した後でも、ここにはまだ2つの異なる球場があります。オーラ、サイコロ、オルノはパフォーマンスとメモリの使用量が非常に似ていますが、PHP-DI、Zend、Symfonyは互いに競争しています。

今後のすべてのテストは、自動装備時間を無視して、測定されているコンテナのパフォーマンスであることを確認します。 PHP依存関係噴射コンテナパフォーマンスベンチマークテスト3 - ディープオブジェクトグラフ

このテストは、コンテナにこのオブジェクトのセットを10,000回構築させることによって行われます。

テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi

注:テストコードを見ることでわかるように、Symfony、PHP-DI、およびAURAには、このテストを実行するために他のコンテナよりもかなり多くの構成コードが必要です。構成時間はテストに含まれていませんでした

PHP依存関係噴射コンテナパフォーマンスベンチマーク

再び、トップ3の間にはほとんど違いがありません。ダイスはオーラよりも20%速く、Ornoよりも70%高速です。 3つすべては、Zend、Php-Di、Symfonyよりもかなり高速です。 3つのトップコンテナの違いは非常にわずかであるため、このような人工ベンチマークの外側の速度の違いに気付かないでしょう。

zend、php-di、および程度は低いsymfonyはここで遅くなります。 Zendは37秒かかり、Diceが1秒未満で管理するタスクを実行します。確かに些細な違いではありません。繰り返しになりますが、Symfonyは有名な容器の中でリードしています。

PHP依存関係噴射コンテナパフォーマンスベンチマーク

メモリとファイルカウントは、他のテストで見たものと一致しています。 PHP依存関係噴射コンテナパフォーマンスベンチマークテスト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倍遅いです。

PHP依存関係噴射コンテナパフォーマンスベンチマーク

メモリの使用量とファイルの数は、実行時間全体で見たコンテナ間の同じ分割で予測可能になりつつあります。 PHP依存関係噴射コンテナパフォーマンスベンチマークテスト5 - サービスを挿入

最終テストは、オブジェクトをどれだけ迅速に構築できるかを確認し、サービスを注入することです。これには、形式が表示されます:PHP依存関係噴射コンテナパフォーマンスベンチマーク

テストコード(githubで):オーラ、サイコロ、ornodi、php-di、symfonydependencyinjection、zenddi

興味深いことに、オーラはこのテストでわずかなリードを奪いました。ただし、SymfonyとAuraには明示的な構成のいくつかの行が必要なため、他のコンテナが依存関係を自動的に解決するため、それはまったく似たようなテストではありません。コンテナを構成するのにかかった時間は、ベンチマークの一部ではありませんでした。
<span>$user = $container->get('User');</span>
ログイン後にコピー
驚くべきことに、PHP-DIはこのタスクで最も遅いです。

PHP依存関係噴射コンテナパフォーマンスベンチマーク

結論

パフォーマンスだけでも、サイコロ、オーラ、オーノはすべて強力な競争相手であり、サイコロは全体的に最も速く、最終テストではオーラが最速です。 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート