搜尋
首頁後端開發php教程PHP依賴注入容器性能基準測試

PHP依賴注入容器性能基準測試

鑰匙要點

  • 依賴性注入容器(DIC)是在較大的PHP應用程序和框架中維護代碼庫的關鍵工具,但會影響性能。 PHP的一些眾所周知的DIC包括PHP-DI,SymfonyDepentientiention,Zenddi,Ornodi,Dice和aura.di.
  • > DIC的性能是根據執行時間,內存使用和所包括的文件數來衡量的。最後一個指標尤其重要,因為它會極大地影響應用程序的整體重量。 在經過測試的容器,骰子,Aura和Orno中,
  • 最快,骰子是最快的。儘管具有獨特的功能,但PHP-DI的性能很大。 Symfony雖然更難配置,但在中間立場上執行,對於那些尋求著名項目容器的人來說,這將是首選的選擇。
  • 儘管性能差異,但DIC的選擇也應考慮配置語法和功能。對於任何實際應用,骰子,Aura和Orno之間的性能差異都可以忽略不計,因此,開發人員應根據他們希望使用的。
  • 大多數框架和較大的PHP應用程序都採用依賴式註入容器,其目標是更可維護的代碼庫。但是,這可能會影響性能。由於加載時間很重要,因此快速保持站點一如既往的重要性。今天,我將基準基準幾個PHP依賴注入容器,以了解其相對性能。 對於那些不熟悉概念的人,依賴性注入容器是一種自動構建對象樹的軟件。例如,考慮一個需要數據庫實例的用戶對象。
依賴項注入容器可用於自動構造對象樹,而無需手動提供參數:

>每次稱呼,都會使用“注入”數據庫對象創建一個用戶對象。 >

有幾個可用於PHP的知名度(並且尚不清楚)的容器:
    PHP-DI,一個流行的DI容器
  • symfonyDipendentibextifement,Symfony框架提供的依賴性注入容器
  • >
  • zenddi Zend Framework提供的依賴式註入容器
  • orn​​odi,一個鮮為人知的容器,具有有限的功能,但刻意
  • 的性能開發
  • 骰子,另一個鮮為人知的容器,重點是輕量級。全面披露,我是這個容器的作者,但在此分析中我將完全客觀。 aura.di,一個相當受歡迎的容器,具有最少的功能
  • >
  • pimple上的單詞:雖然丘疹被廣告為依賴性注入容器,但是從容器中檢索對象總是返回相同的實例,這使得pimple成為服務定位器,而不是依賴性注入容器,因此,無法被測試。

>儘管所有容器都支持不同的功能,但該基準測試將涵蓋依賴項注入容器所需的基本功能。也就是說,創建對象並註入需要的依賴性。

將測量依賴注入的哪些方面?

執行時間

>內存使用
  1. >包括的文件數量。儘管這對性能幾乎沒有影響,但可以很好地指示圖書館的輕量級和便攜式。如果您由於選擇DI而必須用項目運送數百個文件,則可能會嚴重影響您自己應用程序的整體重量。
  2. 測試環境
  3. 所有測試均在運行Arch Linux(3.15內核),PHP 5.5.13和每個容器的最新版本的同一台機器上運行,截至03/07/2014。
顯示的所有執行時間號平均丟棄了比最快慢20%以上的所有執行時間。

測試1 - 創建一個對象的實例

>

此測試使用每個容器創建一個簡單的對象10,000倍

沒有依賴注入容器,這將寫為:> >測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

如您所見,這裡有兩個清晰的營地。 Aura,Dice和Orno的速度大約比PHP-DI,Symfony和Zenddi快十倍。

<span>$user = new User(new Database());</span>
類似於執行時間,有兩個截然不同的群體,在中間的某個地方坐著。

>這是每個容器的輕量級,並且在解釋內存使用差異方面有些輕巧。應該注意的是,Zenddi使用的許多文件都是常見的框架文件,因此,如果您使用Zend Framework,那麼使用Zenddi不會在您的應用程序中其他位置重複使用Zenddi,而不會將相同的內存開銷。

> 同樣,php-di在很大程度上依賴於學說庫。如果您在項目中使用學說,則減少了PHP-DI的內存開銷。

>但是,很高興看到SymfonyDepentIndientientient是框架堆棧的一部分,這是完全獨立的,並且沒有其他Symfony Projects。 aura,骰子和orno沒有任何外部依賴關係,這有助於保持其文件計算。

測試2 - 忽略自動加載

由於加載文件會影響性能,Zend和PHP-DI都加載了大量文件,因此通過首先創建類的單個實例來進行相同的測試,忽略了自動加成時間,以確保在測量之前自動加載任何必需的類時間。

>

這也可能觸發了容器所做的任何內部緩存,但是對每個容器都採用了相同的處理,以使其保持公平

等效的php代碼:

>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

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

PHP依賴注入容器性能基準測試

如預期的那樣,由於沒有測量自動加載時間,記憶使用情況不變,性能稍好一些。但是,這表明php-di,即使加載42個文件也對總執行時間有忽略不計,相對性能保持不變,加載數十個文件並不是PHP-DI和Zenddi的原因相對較慢。 即使忽略了加載文件的開銷,這裡仍然有兩個不同的球場。 Aura,Dice和Orno在性能和內存使用方面非常相似,而PHP-DI,Zend和Symfony僅在彼此之間競爭。

>未來的所有測試都會忽略自動加載的時間,以確保真正是容器的性能。

> PHP依賴注入容器性能基準測試測試3 - 深對像圖

通過讓容器構造這組對象10,000次來完成此測試:>

>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

注意:您可以通過查看測試代碼,Symfony,PHP-DI和AURA所看到的,與其他容器相比,需要更大的配置代碼才能執行此測試。配置時間不包括在測試中。

PHP依賴注入容器性能基準測試

再次,前三名之間的區別很小,骰子比光環快20%,比Orno快70%。這三個都比Zend,PHP-DI和Symfony快得多。三個頂部容器之間的差異是如此微小,以至於您永遠不會注意到像這樣的人造基準之外的速度差異。

zend,php-di,在較小程度上,同伴在這裡很慢。 Zend需要37秒才能在1秒內執行任務骰子管理;當然不是微不足道的差異。同樣,Symfony在大名容器中帶頭。

PHP依賴注入容器性能基準測試

PHP依賴注入容器性能基準測試

內存和文件計數與我們在其他測試中看到的內容一致。

>

測試4 - 從容器中獲取服務

di容器還必須存儲和檢索將在整個應用程序中重複使用的服務。該測試可反復從容器中獲取一個實例。

純PHP等效:

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

>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

PHP依賴注入容器性能基準測試

這是根據先前的結果出乎意料的。除Zend和Symfony以外的所有容器大致相等,僅為0.01,將前4個結果分開。 Symfony不遠,但是Zend的速度比其他人要慢十倍。

>

PHP依賴注入容器性能基準測試

PHP依賴注入容器性能基準測試

>內存使用量和文件結果的數量正在變得可預測,並且在執行時間內看到的容器之間的劃分相同。

>

測試5 - 注入服務

>

>最終測試是查看可以構建對象並註入服務的速度。這採用格式:

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

>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

PHP依賴注入容器性能基準測試

有趣的是,Aura在此測試中略有領先。但是,這並不是類似的測試,因為Symfony和Aura需要幾行明確的配置,而其他容器會自動解決依賴關係。配置容器的時間不是基準的一部分。

> 令人驚訝的是,PHP-DI是該任務最慢的,Zend首次將其位置領先於PHP-DI和Symfony。

PHP依賴注入容器性能基準測試

結論

僅在性能上,骰子,光環和奧爾諾都是強大的競爭對手,骰子在最終測試中的總體上最快,光環最快。兩個不同的組之間的區別很明顯,但是比較每個容器的特徵有趣的。功能和性能的數量不會像您期望的那樣完全相關。 PHP-DI和DICE都包含獨特的功能,但PHP-DI為此而受到了沉重的表現。 Aura雖然很快,但需要大量的手動配置,並且正如您所期望的那樣,具有很小的功能,而骰子和Orno的性能非常相似,但需要更少的配置代碼。 在所有測試中,Symfony在所有測試中都非常重要,儘管與AURA一樣,將其配置為一項更加困難的任務,因為既不支持類型的參數。如果您正在尋找一個眾所周知的項目中的容器,那麼Symfony必須成為首選的容器,如果性能很重要。

也就是說,如果您之後純粹的表現是什麼,那麼Dice和Aura就是Orno非常接近的明顯贏家。但是,值得一提的是配置語法和每個功能,以查看您希望與之合作,因為骰子,Aura和Orno之間的性能差異對於任何真實的應用都可以忽略不計。

所有測試的代碼均可在GitHub上獲得。請注意:GitHub存儲庫包含所測試的庫的副本,而不是使用作曲家將它們包括在項目中,這是為了確保您可以使用我測試的精確版本運行代碼並獲得相同的結果。 >

> PHP依賴注入集裝箱性能基準

的經常詢問問題(常見問題解答)

PHP依賴注入容器性能基準的重要性是什麼?這些基準提供了對各種容器的比較分析,幫助開發人員根據其特定需求做出明智的決定。他們在記憶使用和時間消耗方面提供了對每個容器的性能的見解,這是優化PHP應用程序性能的關鍵因素。 >> PHP依賴性注入如何改善代碼質量? > PHP中的依賴注入(DI)通過促進較大的耦合,增強可測試性和增加代碼可重複性來提高代碼質量。通過注入依賴項,組件變得更加獨立,使代碼更易於修改和測試。這也鼓勵單一的責任原則,因為每個班級只能做應該做的事情,從而導致更清潔,更可維護的代碼。

> PHP中的依賴注入類型是什麼?構造函數是通過類構造函數提供依賴項的地方。 Setter注入涉及通過方法提供依賴項。接口注入要求依賴類要實現一個接口,該接口將注入依賴項。

>依賴性注入容器在PHP中如何工作?

>

容器,管理應用程序中服務或對象的實例化和配置。它充當負責創建和返回依賴實例的工廠。它還管理共享實例,確保每次請求共享服務時都會返回一個實例。

選擇依賴項注入容器時,我應該考慮哪些因素?容器,考慮諸如易用性,績效,社區支持和與您項目兼容的因素。性能尤其重要,這是PHP依賴注入集裝箱性能基準測試中用場的地方。它們提供了對各種容器的性能的比較分析,可幫助您做出明智的決定。

>

>依賴注射如何有助於PHP中的更好的測試?班級的依賴項。這允許在測試過程中嘲笑或固執,使您可以孤立地測試類。這也使編寫單元測試變得更容易,因為您可以注入可提供可預測響應的模擬依賴項,從而使您的測試更加可靠且更易於編寫。

>

>我可以在任何PHP項目中使用依賴項注入嗎?是的,無論其大小或複雜性如何,都可以在任何PHP項目中使用依賴注入。這是一種設計模式,可促進代碼可重複性,模塊化性和可檢驗性,使其成為任何PHP開發人員的寶貴工具。

>依賴性注入對應用程序性能的影響是什麼?由於額外的抽象層,可以引入輕微的開銷,對應用程序性能的影響通常可以忽略不計。改善代碼質量,可檢驗性和可維護性的好處通常超過任何較小的性能成本。

依賴性注入與PHP中的固體原理有何關係? 依賴性注入與固體原理密切相關,尤其是依賴性反轉原理(DIP)。 DIP指出,高級模塊不應取決於低級模塊,但兩者都應取決於抽象。依賴注入可以通過使您能夠將依賴項注入接口或抽像類,而不是具體類。通常不建議使用單個PHP項目中使用多個依賴性注入容器。使用多個容器可能會導致更難管理和理解的代碼。通常最好選擇一個最適合您項目需求並堅持下去的容器。 >

以上是PHP依賴注入容器性能基準測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
繼續使用PHP:耐力的原因繼續使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python:探索他們的相似性和差異PHP和Python:探索他們的相似性和差異Apr 19, 2025 am 12:21 AM

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

PHP和Python:解釋了不同的範例PHP和Python:解釋了不同的範例Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:深入了解他們的歷史PHP和Python:深入了解他們的歷史Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

在PHP和Python之間進行選擇:指南在PHP和Python之間進行選擇:指南Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和框架:現代化語言PHP和框架:現代化語言Apr 18, 2025 am 12:14 AM

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的影響:網絡開發及以後PHP的影響:網絡開發及以後Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中