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