Heim >Backend-Entwicklung >PHP-Tutorial >PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌Original
2025-02-20 12:23:14403Durchsuche

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Key Takeaways

  • Abhängigkeitsinjektionsbehälter (DIC) sind ein wichtiges Instrument zur Aufrechterhaltung von Codebasen in größeren PHP -Anwendungen und Frameworks, können jedoch die Leistung beeinflussen. Einige der bekannten DICs für PHP umfassen PHP-Di, SymfonyDependencyInjection, Zenddi, Ordi, Dice und Aura.di.
  • Die Leistung von DICs wird anhand der Ausführungszeit, der Speicherverwendung und der Anzahl der enthaltenen Dateien gemessen. Die letzte Metrik ist besonders wichtig, da sie das Gesamtgewicht einer Anwendung stark beeinflussen kann.
  • Unter den getesteten Behältern waren Würfel, Aura und Orno am schnellsten, wobei Würfel die insgesamt schnellsten waren. PHP-DI hatte trotz einzigartiger Merkmale einen erheblichen Leistungsverlust. Symfony schwieriger zu konfigurieren, im Mittelweg durchgeführt und wäre die bevorzugte Wahl für diejenigen, die einen Container aus einem bekannten Projekt suchen.
  • Trotz der Leistungsunterschiede sollte die Auswahl eines DIC auch die Konfigurationssyntax und die Funktionen berücksichtigen. Der Leistungsunterschied zwischen Würfel, Aura und Orno ist für jede wirkliche Anwendung vernachlässigbar. Daher sollten Entwickler wählen, basierend darauf, mit der sie lieber arbeiten würden.

Die meisten Frameworks und größeren PHP -Anwendungen verwenden einen Abhängigkeitsinjektionsbehälter mit dem Ziel einer wartbaren Codebasis. Dies kann sich jedoch auf die Leistung auswirken. Da die Ladezeiten wichtig sind, ist es wichtig, Websites schnell wie nie zuvor zu halten. Heute werde ich mehrere PHP -Abhängigkeitsinjektionsbehälter bewerten, um zu sehen, wie ihre relative Leistung aussieht.

Für diejenigen, die mit dem Konzept nicht vertraut sind, ist ein Abhängigkeitsinjektionsbehälter eine Software, die automatisch einen Objektbaum erstellt. Betrachten Sie beispielsweise ein Benutzerobjekt, das eine Datenbankinstanz erfordert.

<span>$user = new User(new Database());</span>

Ein Abhängigkeitsinjektionsbehälter kann verwendet werden, um den Objektbaum automatisch zu konstruieren, ohne die Parameter manuell bereitzustellen:

<span>$user = $container->get('User');</span>

Jedes Mal, wenn dies aufgerufen wird, wird ein Benutzerobjekt mit dem Datenbankobjekt "injiziert" erstellt.

Es gibt mehrere bekannte (und nicht so bekannte) Behälter für PHP:

  • php-di, ein beliebter DI-Container
  • SymfonyDependencyInjection, der vom Symfony Framework
  • bereitgestellte Abhängigkeitsinjektionsbehälter
  • Zenddi Der von Zend Framework bereitgestellte Abhängigkeitsinjektionsbehälter
  • ornodi, ein weniger bekannter Behälter mit begrenzten Merkmalen, aber mit Blick auf die Leistung
  • entwickelt
  • Würfel, ein weiterer weniger bekannter Behälter mit Schwerpunkt darauf, leicht zu sein. Vollständige Offenlegung, ich bin der Autor dieses Containers, aber ich werde in dieser Analyse geradezu objektiv sein.
  • Aura.di, ein ziemlich beliebter Behälter mit minimalen Funktionen

A word on Pimple: Although Pimple is advertised as a Dependency Injection Container, retrieving an object from the container always returns the same instance, which makes Pimple a Service Locator rather than a Dependency Injection Container and as such, cannot getestet werden.

Obwohl alle Container unterschiedliche Merkmale unterstützen, wird dieser Benchmark die grundlegende Funktionalität abdecken, die durch einen Abhängigkeitsinjektionsbehälter erforderlich ist. Das heißt, das Erstellen von Objekten und das Injektieren von Abhängigkeiten, an denen sie benötigt werden.

Welche Aspekte der Abhängigkeitsinjektion werden gemessen?
  1. Ausführungszeit
  2. Speicherverbrauch
  3. Anzahl der enthaltenen Dateien. Obwohl dies nur sehr geringe Auswirkungen auf die Leistung hat, ist dies ein guter Indikator dafür, wie leicht und tragbar eine Bibliothek ist. Wenn Sie aufgrund Ihrer DI -Wahl Hunderte Dateien mit Ihrem Projekt versenden müssen, kann dies das Gesamtgewicht Ihrer eigenen Anwendung stark beeinflussen.

Testumgebung

Alle Tests wurden auf derselben Maschine ausgeführt, die Arch Linux (3.15 Kernel), Php 5.5.13 und die neuesten Versionen jedes Containers ab dem 03.07.2014.

Alle dargestellten Ausführungszeitzahlen sind durchschnittlich 10 Läufe, nachdem alle über 20% langsamer als die schnellsten abgeworfen wurden.

Test 1 - Erstellen Sie eine Instanz eines Objekts

Dieser Test verwendet jeden Container, um 10.000 Mal ein einfaches Objekt zu erstellen

ohne Abhängigkeitsinjektionsbehälter würde dies als:
<span>$user = new User(new Database());</span>
geschrieben sein

Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Wie Sie sehen, gibt es hier zwei klare Camps. Aura, Würfel und Orno sind ungefähr zehnmal schneller als Php-di, Symfony und Zenddi.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Ähnlich wie bei der Ausführungszeit gibt es zwei verschiedene Gruppen mit Symfony irgendwo im Mittelweg.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Dies ist sehr aussagekräftig darüber, wie leicht jeder Container ist, und geht dazu, die Unterschiede für die Speicherverwendung zu erklären. Es ist zu beachten, dass viele der von Zenddi verwendeten Dateien gemeinsame Framework -Dateien sind. Wenn Sie Zend Framework verwenden, wird die Verwendung von Zenddi nicht denselben Speicheraufwand wie Dateien an anderer Stelle in Ihrer Anwendung wiederverwendet.

In ähnlicher Weise stützt sich Php-di stark auf Doktrinbibliotheken. Wenn Sie Doktrin in Ihrem Projekt verwenden, wird der Speicheraufwand von PHP-d reduziert.

Es ist jedoch schön zu sehen, dass SymfonyDependenzinjektion, obwohl er Teil des Rahmenstapels ist, völlig eigenständig ist und ohne Abhängigkeiten von anderen Symfony -Projekten funktioniert.

Aura, Würfel und Orno haben keine externen Abhängigkeiten, und dies hilft dabei, ihre Dateizählungen niedrig zu halten.

Test 2 - Autoloading ignorieren

Da das Laden von Dateien die Leistung beeinflussen kann und sowohl Zend als auch PHP-D eine signifikante Anzahl von Dateien geladen haben, wurde derselbe Test durchgeführt, wobei die Autoloaderzeit ignoriert wurde die Zeit.

Dies kann auch jedes interne zwischen dem Behälter durchgeführte interne Caching ausgelöst haben, aber die gleiche Behandlung wurde auf jeden Behälter angewendet, um es fair zu halten

äquivalenter PHP -Code:

<span>$user = new User(new Database());</span>

Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Wie erwartet ist die Speicherverwendung unverändert und die Leistung ist etwas besser, da die Autoloaderzeit nicht gemessen wird. Dies zeigt jedoch, dass PHP-DI, selbst das Laden von 42 Dateien einen vernachlässigbaren Einfluss auf die Gesamtausführungszeit hat und die relative Leistung gleich bleibt. Das Laden von Dutzenden von Dateien ist nicht die Ursache für PHP-DI und Zenddi mit einer relativ langsamen Leistung.

Auch nachdem der Overhead des Ladens von Dateien ignoriert wurde, gibt es hier noch zwei unterschiedliche Basonparks. Aura, Würfel und Orno sind in Bezug

Alle zukünftigen Tests ignorieren die Autoload -Zeit, um sicherzustellen, dass es wirklich die Leistung des Containers ist.

Test 3 - Deep Object Graph

Dieser Test wird durchgeführt, indem die Container diesen Satz von Objekten 10.000 Mal konstruieren:

<span>$user = $container->get('User');</span>
Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi

Hinweis: Wie Sie den Testcode betrachten können, benötigen Symfony, Php-DI und Aura erheblich mehr Konfigurationscode als die anderen Container, um diesen Test durchzuführen. Die Konfigurationszeit wurde im Test nicht enthalten.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Auch hier gibt es nur sehr geringe Unterschiede zwischen den Top 3, wobei die Würfel 20% schneller als Aura und 70% schneller als Orno sind. Alle drei sind erheblich schneller als Zend, Php-di und Symfony. Der Unterschied zwischen den drei Top -Containern ist so gering, dass Sie den Geschwindigkeitsunterschied außerhalb eines künstlichen Benchmarks wie diesem nie bemerken würden.

Zend, Php-di und in geringerem Maße Symfony sind hier langsam. Zend braucht 37 Sekunden, um eine Aufgabe durchzuführen, die in weniger als 1 Sekunde DICE verwaltet. Sicher kein trivialer Unterschied. Noch einmal übernimmt Symfony die Führung unter den großen Namensbehältern.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Speicher- und Dateizählungen stimmen mit dem überein, was wir in anderen Tests gesehen haben.

Test 4 - Abrufen eines Dienstes aus dem Container

DI -Container müssen auch Dienste speichern und abrufen, die während des gesamten Antrags wiederverwendet werden. Dieser Test holt wiederholt eine einzelne Instanz aus dem Container.

reines PHP -Äquivalent:

<span>$user = new User(new Database());</span>

Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Dies ist aufgrund früherer Ergebnisse unerwartet. Alle Behälter mit Ausnahme von Zend und Symfony sind ungefähr gleich mit nur 0,01s, die die Top 4 -Ergebnisse treten. Symfony ist nicht weit dahinter, aber Zend ist weit über zehnmal langsamer als die anderen.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Speicherverbrauch und Anzahl der Dateienergebnisse werden mit derselben Teilung zwischen den Containern, die wir in der Ausführungszeit gesehen haben, vorhersehbar.

.

Test 5 - Injizieren Sie einen Dienst

Der endgültige Test besteht darin, zu sehen, wie schnell ein Objekt konstruiert und einen Dienst injiziert werden kann. Dies nimmt das Format an:
<span>$user = $container->get('User');</span>

Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Interessanterweise hat Aura in diesem Test einen leichten Vorsprung geführt. Es ist jedoch kein ähnlicher Test, da Symfony und Aura mehrere explizite Konfigurationslinien erfordern, während die anderen Container die Abhängigkeit automatisch beheben. Die Zeit, die zum Konfigurieren des Containers benötigt wurde, war nicht Teil des Benchmarks.

überraschenderweise ist PHP-Di am langsamsten bei dieser Aufgabe, und Zend übernimmt zum ersten Mal seine Position vor PHP-Di und Symfony.

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Schlussfolgerung

allein bei der Leistung, Würfel, Aura und Orno sind alle starke Konkurrenten, Würfel sind in der Gesamtfläche am schnellsten und Aura am schnellsten im endgültigen Test. Der Unterschied zwischen den beiden unterschiedlichen Gruppen ist offensichtlich, aber es ist interessant, die Merkmale jedes Behälters zu vergleichen. Anzahl der Funktionen und Leistung korrelieren nicht ganz wie erwartet. Sowohl PHP-DI als auch DICE enthalten einzigartige Funktionen, aber für den PHP-DI erhält einen starken Leistungsverlust. Aura erfordert zwar schnell, erfordert eine Menge manueller Konfiguration und hat, wie zu erwarten, sehr minimale Funktionen, während Würfel und Orno eine sehr ähnliche Leistung haben, aber viel weniger Code benötigen, um zu konfigurieren.

Symfony befindet sich in allen Tests sehr im Mittelweg, obwohl es eine viel schwierigere Aufgabe ist, es wie bei Aura zu konfigurieren, da kein der der beiden Unterstützungsparameter angedeutet wird. Wenn Sie nach einem Behälter aus einem bekannten Projekt suchen, muss Symfony der Container der Wahl sein, wenn die Leistung wichtig ist.

, dass es die klaren Gewinner mit Orno sehr nahe dahinter sind, wenn reine Leistung das ist. Es lohnt sich jedoch, sich auf die Konfigurationssyntax und die Merkmale einzelnen zu sehen, mit denen Sie es vorziehen würden, als Leistungsunterschied zwischen Würfel, Aura und Orno für jede wirkliche Anwendung vernachlässigbar zu sein.

Alle Code für die Tests finden Sie in GitHub. Bitte beachten Sie: Das Github -Repository enthält Kopien der getesteten Bibliotheken, anstatt Komponisten in das Projekt aufzunehmen. Dies soll sicherstellen, dass Sie den Code mit den genauen Versionen ausführen können, die ich getestet habe, und dieselben Ergebnisse erhalten.

häufig gestellte Fragen (FAQs) zu PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks

Welche Bedeutung hat die Bedeutung von PHP -Abhängigkeitsinjektionsbehälterleistung. Diese Benchmarks bieten eine vergleichende Analyse verschiedener Container und helfen Entwicklern, fundierte Entscheidungen darüber zu treffen, welcher Container aufgrund ihrer spezifischen Bedürfnisse verwendet werden soll. Sie bieten Einblicke in die Leistung jedes Containers hinsichtlich des Speicherverbrauchs und des Zeitverbrauchs, die kritische Faktoren für die Optimierung der Leistung von PHP -Anwendungen sind. > Die Abhängigkeitsinjektion (DI) in PHP verbessert die Codequalität durch Förderung der losen Kopplung, Verbesserung der Testbarkeit und zunehmender Wiederverwendbarkeit der Code. Durch die Injektion von Abhängigkeiten werden die Komponenten unabhängiger, wodurch der Code leichter zu ändern und zu testen ist. Es fördert auch das Prinzip der einzelnen Verantwortung, da jede Klasse nur das tut, was sie tun soll, was zu sauberer und wartbarerer Code führt.

Was sind die verschiedenen Arten der Abhängigkeitsinjektion in PHP? In der Konstruktorinjektion werden die Abhängigkeiten über einen Klassenkonstruktor bereitgestellt. Die Setter -Injektion beinhaltet die Bereitstellung der Abhängigkeiten über Methoden. Die Schnittstelleninjektion erfordert die abhängige Klasse, um eine Schnittstelle zu implementieren, die die Abhängigkeit injiziert. Container verwaltet die Instanziierung und Konfiguration von Diensten oder Objekten in einer Anwendung. Es fungiert als Fabrik, die für die Erstellung und Rückgabe von Fällen von Abhängigkeiten verantwortlich ist. Es verwaltet auch gemeinsame Instanzen und stellt sicher, dass jedes Mal, wenn ein gemeinsamer Dienst angefordert wird Container, berücksichtigen Sie Faktoren wie Benutzerfreundlichkeit, Leistung, Community -Unterstützung und Kompatibilität mit Ihrem Projekt. Die Leistung ist besonders wichtig, und hier sind die Performance -Benchmarks von PHP -Abhängigkeitseinspritzung nützlich. Sie bieten eine vergleichende Analyse der Leistung verschiedener Container und helfen Ihnen, eine fundierte Entscheidung zu treffen. Abhängigkeiten einer Klasse. Auf diese Weise können Abhängigkeiten während des Tests verspottet oder gestoppt werden, sodass Sie isolierte Klassen testen können. Es erleichtert auch das Schreiben von Unit -Tests, da Sie Scheinabhängigkeiten injizieren können, die vorhersehbare Antworten liefern, und Ihre Tests zuverlässiger und einfacher zu schreiben.

Ja, die Abhängigkeitsinjektion kann in jedem PHP -Projekt unabhängig von seiner Größe oder Komplexität verwendet werden. Es ist ein Entwurfsmuster, das Code -Wiederverwendbarkeit, Modularität und Testbarkeit fördert, was es zu einem wertvollen Instrument für einen PHP -Entwickler macht. Kann aufgrund der zusätzlichen Abstraktionsschicht einen leichten Overhead einführen, ist der Einfluss auf die Anwendungsleistung im Allgemeinen vernachlässigbar. Die Vorteile einer verbesserten Codequalität, Testbarkeit und Wartbarkeit überwiegen häufig geringfügige Leistungskosten.

Wie hängt die Abhängigkeitsinjektion mit den festen Prinzipien in PHP zusammen? DIP gibt an, dass hochrangige Module nicht von Modulen auf niedrigem Niveau abhängen sollten, sondern von beiden von Abstraktionen abhängen sollten. Die Abhängigkeitsinjektion ermöglicht dies, indem Sie es ermöglichen, Abhängigkeiten als Schnittstellen oder abstrakte Klassen zu injizieren, anstatt konkrete Klassen. In einem einzigen PHP -Projekt können mehrere Abhängigkeitseinspritzbehälter verwendet werden. Es wird im Allgemeinen nicht empfohlen. Die Verwendung mehrerer Container kann zu Code führen, der schwieriger zu verwalten und zu verstehen ist. Normalerweise ist es besser, einen Container auszuwählen, der den Anforderungen Ihres Projekts am besten entspricht und dabei bleibt.

Das obige ist der detaillierte Inhalt vonPHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn