Heim >Backend-Entwicklung >PHP-Tutorial >PHP -Abhängigkeitsinjektionsbehälterleistung Benchmarks
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:
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.
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.
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
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.
Ähnlich wie bei der Ausführungszeit gibt es zwei verschiedene Gruppen mit Symfony irgendwo im Mittelweg.
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.
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
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
<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.
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.
Speicher- und Dateizählungen stimmen mit dem überein, was wir in anderen Tests gesehen haben.
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
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.
Speicherverbrauch und Anzahl der Dateienergebnisse werden mit derselben Teilung zwischen den Containern, die wir in der Ausführungszeit gesehen haben, vorhersehbar.
.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
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.
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.
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!