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

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

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-20 12:23:14
原創
395 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板