CakePHP的性能一直以來口碑不佳。
和CI/Yii比較,輸出一個簡單的hello world或者稍微復雜一點,從數據庫讀取幾條數據并echo時,測試結果表明每秒處理能力要相差好幾倍。
這并非意味著CakePHP的編碼質量有問題,而是Cake加載了更多的輔助類,作了更多的數據和魔術處理,這對于簡單的測試程序有點overhead了。
實際上獲取若干數據的性能也和測試代碼息息相關。有很多因素會在沒有意識到的情況下影響測試結果的客觀性。
為了更好的了解影響性能的因素,本文使用siege對一個簡單的從數據庫獲取3條用戶記錄并打印到頁面的程序進行了多方面的測試。
測試平臺
CPU:2個處理器,Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
Mem:2G內存
OS:CentOS
CakePHP版本:1.3.11
命令:
[test@test siege-2.70]$ siege -b -c5 -r10 http://localhost:5800/consumers
測試用例1
關閉cache、加載系統配置(app/config/...),加載定制的路由,加載常用組件Auth,ACL,Session,Cookie,加載常用helper:Html,Form,Layout,Javascript,Image。
數據表存在3個關聯表,使用默認recursive,即在查詢時同時返回所有關聯表數據??刂破鱝ction代碼如下:
function index() {
$this->theme = 'v1';
$this->layout = false;
//$this->Consumer->recursive = -1;
$consumers = $this->Consumer->find('all',array('limit'=>10));
$this->set('consumers', $consumers);
}
測試結果
處理能力2~3個請求/秒
測試用例2
關閉cache,去除所有和讀取數據并顯示無關代碼(即移除任何沒有使用到的通用代碼如讀取配置、路由設置、組件、Helper),recursive設置成-1,把上面的代碼中的紅色部分uncomment掉,即不讀取任何關聯表數據。
測試結果
處理能力在7~8個請求/秒
測試用例3
在測試用例2的基礎上開啟Cake的cache
測試結果
處理能力在17~19個請求/秒
結論:
影響測試結果的因素很多,基本上在不使用Cache的情況下,處理能力和加載了多少公共類和添加了多少處理公共邏輯的代碼直接相關。
最差結果和最佳結果之間差別達到一個數量級。深入了解影響性能的因素是優化性能的前提和基礎。
接下去準備用CI讀取相同的數據做進一步的測試和對比。