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-DI,一個流行的DI容器
- symfonyDipendentibextifement,Symfony框架提供的依賴性注入容器
- > zenddi Zend Framework提供的依賴式註入容器
- ornodi,一個鮮為人知的容器,具有有限的功能,但刻意
- 的性能開發 骰子,另一個鮮為人知的容器,重點是輕量級。全面披露,我是這個容器的作者,但在此分析中我將完全客觀。
- > pimple上的單詞:雖然丘疹被廣告為依賴性注入容器,但是從容器中檢索對象總是返回相同的實例,這使得pimple成為服務定位器,而不是依賴性注入容器,因此,無法被測試。
>儘管所有容器都支持不同的功能,但該基準測試將涵蓋依賴項注入容器所需的基本功能。也就是說,創建對象並註入需要的依賴性。
將測量依賴注入的哪些方面?執行時間
>內存使用
- >包括的文件數量。儘管這對性能幾乎沒有影響,但可以很好地指示圖書館的輕量級和便攜式。如果您由於選擇DI而必須用項目運送數百個文件,則可能會嚴重影響您自己應用程序的整體重量。
- 測試環境
- 所有測試均在運行Arch Linux(3.15內核),PHP 5.5.13和每個容器的最新版本的同一台機器上運行,截至03/07/2014。
測試1 - 創建一個對象的實例
>此測試使用每個容器創建一個簡單的對象10,000倍
沒有依賴注入容器,這將寫為:
如您所見,這裡有兩個清晰的營地。 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。
由於加載文件會影響性能,Zend和PHP-DI都加載了大量文件,因此通過首先創建類的單個實例來進行相同的測試,忽略了自動加成時間,以確保在測量之前自動加載任何必需的類時間。
>
這也可能觸發了容器所做的任何內部緩存,但是對每個容器都採用了相同的處理,以使其保持公平
等效的php代碼:
>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
<span>$user = new User(new Database());</span>
如預期的那樣,由於沒有測量自動加載時間,記憶使用情況不變,性能稍好一些。但是,這表明php-di,即使加載42個文件也對總執行時間有忽略不計,相對性能保持不變,加載數十個文件並不是PHP-DI和Zenddi的原因相對較慢。 即使忽略了加載文件的開銷,這裡仍然有兩個不同的球場。 Aura,Dice和Orno在性能和內存使用方面非常相似,而PHP-DI,Zend和Symfony僅在彼此之間競爭。
>未來的所有測試都會忽略自動加載的時間,以確保真正是容器的性能。>
測試3 - 深對像圖
通過讓容器構造這組對象10,000次來完成此測試:
>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
注意:您可以通過查看測試代碼,Symfony,PHP-DI和AURA所看到的,與其他容器相比,需要更大的配置代碼才能執行此測試。配置時間不包括在測試中。
再次,前三名之間的區別很小,骰子比光環快20%,比Orno快70%。這三個都比Zend,PHP-DI和Symfony快得多。三個頂部容器之間的差異是如此微小,以至於您永遠不會注意到像這樣的人造基準之外的速度差異。
zend,php-di,在較小程度上,同伴在這裡很慢。 Zend需要37秒才能在1秒內執行任務骰子管理;當然不是微不足道的差異。同樣,Symfony在大名容器中帶頭。
內存和文件計數與我們在其他測試中看到的內容一致。
>測試4 - 從容器中獲取服務
di容器還必須存儲和檢索將在整個應用程序中重複使用的服務。該測試可反復從容器中獲取一個實例。
純PHP等效:
<span>$user = new User(new Database());</span>
>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
這是根據先前的結果出乎意料的。除Zend和Symfony以外的所有容器大致相等,僅為0.01,將前4個結果分開。 Symfony不遠,但是Zend的速度比其他人要慢十倍。
>
>內存使用量和文件結果的數量正在變得可預測,並且在執行時間內看到的容器之間的劃分相同。
>測試5 - 注入服務
>>最終測試是查看可以構建對象並註入服務的速度。這採用格式:
<span>$user = $container->get('User');</span>
>測試代碼(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
> 令人驚訝的是,PHP-DI是該任務最慢的,Zend首次將其位置領先於PHP-DI和Symfony。
結論
僅在性能上,骰子,光環和奧爾諾都是強大的競爭對手,骰子在最終測試中的總體上最快,光環最快。兩個不同的組之間的區別很明顯,但是比較每個容器的特徵有趣的。功能和性能的數量不會像您期望的那樣完全相關。 PHP-DI和DICE都包含獨特的功能,但PHP-DI為此而受到了沉重的表現。 Aura雖然很快,但需要大量的手動配置,並且正如您所期望的那樣,具有很小的功能,而骰子和Orno的性能非常相似,但需要更少的配置代碼。 在所有測試中,Symfony在所有測試中都非常重要,儘管與AURA一樣,將其配置為一項更加困難的任務,因為既不支持類型的參數。如果您正在尋找一個眾所周知的項目中的容器,那麼Symfony必須成為首選的容器,如果性能很重要。
也就是說,如果您之後純粹的表現是什麼,那麼Dice和Aura就是Orno非常接近的明顯贏家。但是,值得一提的是配置語法和每個功能,以查看您希望與之合作,因為骰子,Aura和Orno之間的性能差異對於任何真實的應用都可以忽略不計。 所有測試的代碼均可在GitHub上獲得。請注意:GitHub存儲庫包含所測試的庫的副本,而不是使用作曲家將它們包括在項目中,這是為了確保您可以使用我測試的精確版本運行代碼並獲得相同的結果。 >> PHP依賴注入集裝箱性能基準
的經常詢問問題(常見問題解答)PHP依賴注入容器性能基準的重要性是什麼?這些基準提供了對各種容器的比較分析,幫助開發人員根據其特定需求做出明智的決定。他們在記憶使用和時間消耗方面提供了對每個容器的性能的見解,這是優化PHP應用程序性能的關鍵因素。 >依賴性注入容器在PHP中如何工作? >> PHP中的依賴注入類型是什麼?構造函數是通過類構造函數提供依賴項的地方。 Setter注入涉及通過方法提供依賴項。接口注入要求依賴類要實現一個接口,該接口將注入依賴項。
>
>依賴注射如何有助於PHP中的更好的測試?班級的依賴項。這允許在測試過程中嘲笑或固執,使您可以孤立地測試類。這也使編寫單元測試變得更容易,因為您可以注入可提供可預測響應的模擬依賴項,從而使您的測試更加可靠且更易於編寫。 依賴性注入與PHP中的固體原理有何關係?
以上是PHP依賴注入容器性能基準測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
