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,即在查询时同时返回所有关联表数据。控制器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);
}
测试结果
处理能力2~3个请求/秒
测试用例2
关闭cache,去除所有和读取数据并显示无关代码(即移除任何没有使用到的通用代码如读取配置、路由设置、组件、Helper),recursive设置成-1,把上面的代码中的红色部分uncomment掉,即不读取任何关联表数据。
测试结果
处理能力在7~8个请求/秒
测试用例3
在测试用例2的基础上开启Cake的cache
测试结果
处理能力在17~19个请求/秒
结论:
影响测试结果的因素很多,基本上在不使用Cache的情况下,处理能力和加载了多少公共类和添加了多少处理公共逻辑的代码直接相关。
最差结果和最佳结果之间差别达到一个数量级。深入了解影响性能的因素是优化性能的前提和基础。
接下去准备用CI读取相同的数据做进一步的测试和对比。