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

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 までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

MantisBT

MantisBT

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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