2011-12-19 22 views
6

我正在使用Zend Framework 1.11,Doctrine 2,一些Symfony 2組件和其他工具&庫進行項目工作。優化我的表現

我試圖優化使用Xdebug的性能& Webgrind。

我已經發現了像解析Ini配置等一些瓶頸,並緩存了。現在

,我只是意識到,自動加載是我的應用程序中最昂貴的部分:

Opl\Autoloader\ApcLoader->loadClass     274 31.36 43.86 
    Zend_Loader_PluginLoader->load       150 4.80 12.29 
    Zend_Loader_Autoloader->getClassAutoloaders   278 1.42 1.91 
    Zend_Controller_Router_Route_Regex->_getMappedValues 291 1.29 1.35 
    Doctrine\ORM\UnitOfWork->createEntity     85 1.24 3.18 

如你我不使用默認的Zend_Loader_Autoloader,我使用Opl這是看到的,因爲據我所知,比它快,我使用帶有APC緩存的classMapLoader,但與其他應用程序相比,它仍然有點慢。

我該如何優化?

我已經加載了大約250個類,它看起來只有〜40個很慢,其他人顯示0,00爲「總調用成本」,但其他人則在需求調用中從0,08增加到0,57。

順便說一句,由於使用Opl自動加載器,它看起來在我的生產環境中APC只操作緩存「手動需要」的文件而不是自動加載器調用的文件。

回答

4

如果重構你的代碼不是一個選項(drop Zend Framework,Drop Doctrine,Drop ...),我會首先優化購買更好的硬件。這會自動優化你的代碼,因爲代碼的上下文剛剛移動(這不是完全優化代碼,因爲代碼不會改變)。

如果這不是一個選項,可以考慮創建一個構建系統,它可以預處理您的代碼庫並創建一個非開發版本來削減加載過程。這需要分析總是需要哪些文件,並將它們全部編譯成加載程序優化的格式,這可能是單個文件和/或靜態類加載器映射。

然而衆所周知,Zend總是需要將大量內存加載到內存中。即使使用像APC這樣的PHP緩存可能已經爲您帶來了一些東西(考慮使用前面提到的構建腳本進行預編譯,並優化您的指標強調的部分)。

如果您的應用程序結構允許,還有另外一種可能性:請將整個應用程序保存在內存中。這可以通過PHP網絡服務器完成。完成之後,代碼只需要在服務器啓動後加載,永遠不需要再次加載。這隻適用於您自己的應用程序,如果它支持多個請求。一個好的封裝應用程序,尤其是使用請求邏輯的應用程序可以很容易地被採用。現有的解決方案是appserver-in-php。與您從APC獲得的收益相比,您會驚訝速度提高了多少。

也許這是有幫助的。任何額外的,更具體的建議都很難做到,因爲無法看到您的代碼正在運行,也沒有詳細的指標。你剛剛在幕後傳遞了一個片段,所以很難更具體地告訴你。

+0

謝謝你的偉大答案,事實上,我的問題是我從ZF1.7和Zend_Db及其交易從舊式應用程序遷移費率(由圍攻給出)返回類似30/40/s的地方只有10,但我做了很多優化,如查詢優化,可以減少全球請求時間,但我有點失望,有這樣的速度。當然,購買新硬件是一種解決方案,它會是,但我不希望它成爲解決方案。在看自動加載器時,看起來Doctrine需要比Zend Framework本身更多的文件。 – Trent 2011-12-19 13:10:13

+0

考慮一下,如果你真的需要在你的應用程序中使用ORM。如果你不這樣做,放棄原則,只使用* table data gateway *或* row data gateway * zend library offers。或者在PDO中使用PHP本地mysql驅動程序來堅持自己的數據庫抽象。如果數據庫是您的瓶頸,請將您的代碼和數據庫放在一起以獲得更短的路徑。這可能會減少ORM提供的一些舒適選項,但是通過創建自己的函數來獲取數據並將數據推送到mysql存儲,您的速度會更快,並且可以編寫您自己的舒適代碼。 – hakre 2011-12-19 13:18:51

+1

我喜歡建議放棄各種東西(即減輕)。我不在乎「購買更好的硬件,這會自動優化你的代碼」。這就好比說,如果賽馬會太胖,會得到一匹更快的馬。芯片供應商的勤奮工程師爲我們提供更快的硬件而做出了驚人的工作。我想知道他們是否知道程序員是依賴於這個的,而不是讓他們的代碼脫離胖子? – 2011-12-19 14:20:05

1

我不喜歡什麼hakre建議。首先,我會看看我是否可以放棄Web服務器。如果是這樣,一個好的選擇是nginx或lighttpd。與Apache相比,它們來自本世紀,配置也更容易。關於自動加載我真的不知道,但如果類文件非常大,你是否嘗試安裝RAM磁盤或使用PHP壓縮器?根據我的經驗,PHP壓縮器可以顯着縮短執行時間(即解析時間)。

3

我嘗試使用Xdebug的&以優化性能Webgrind

OK,既然你在認真地需要性能更好的位置的時候,你可能會開到比人氣較少,但demonstrably有效的方法來做到這一點。

它適用於任何語言,只要有一個可以暫停的調試器,如Xdebug。

這裏描述了in a nutshellHere's one demonstration of its effectiveness. 我可以鏈接你更多。

你可能會發現它有點智力上扭傷。如在

  1. 您正在發現與例程相關的「瓶頸」時間。最有價值的加速機會通常不會以這種方式表現出來。它們是你可以在看到它們時容易描述的活動,但它們是瀰漫的。他們不會將重要時間集中在任何特定的程序或代碼行中,因此分析人員不會看到它們。

  2. 最大的加速機會可能並不容易解決。他們可能需要重新考慮該計劃的組織方式。如果你發現了一些你可以輕易修復的東西,那太棒了。繼續做吧。如果它不是那麼容易修復的,但仍然可以節省大量時間,如果您需要節省時間,那麼您必須做到這一點,無論喜歡與否。

祝你好運。

0

我沒有太多的經驗,但一旦我有這樣的問題。我已經檢查了我的包含路徑,並按照最大使用的庫路徑的順序進行處理。而且我有近30%的提升。我認爲它已經被你知道,但已張貼任何方式....... :)