PHP归档phar性能测试
测试环境:
PHP:5.5.10
CPU:2GHz intel core i7
Mem:8GB
系统:Darwin 13.1.0
主要测试点:
1:Phar加载速度
1.1:文件大小多少的影响?
1.2: include/require的影响?
1.3:Phar 存根(Stub)内容的影响?
2:Phar代码执行速度
2.1 全局函数对比
2.2 类对象
2.3 类方法
为了保证尽量保证测试准确,每种方式运行3次,去3次的平均值。同时作为对比,我们会直接采用代码方式,获得基准数据。
Phar 文件主要包含文件
phar-builder.php用于生成phar文件,执行test命令前,先执行此文件生成phar-test.phar文件。
test_load.php 测试加载phar文件速度
src目录内包含文件index.php文件是存根文件,包含dates.php,fZ喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vci5waHAsZnVuY3Rpb25zLnBocKOsZGF0ZXOy4srUzsS8/sDgt723qKOsZm9yLnBocLLiytS21M/zt723qKOsZnVuY3Rpb25zLnBocLLiytS6r8r9t723qKGjPGJyIC8+vt/M5bi9vP60+sLroaM8YnIgLz612tK7o7pwaGFyvNPU2MvZtsijrLLJ08NpbmNsdWRlus1yZXF1aXJlt73KvbLiytS3os/Wsu7S7LK7tPOjrNa7ssnTw3JlcXVpcmW3vcq9oaM8YnIgLz48L3A+PHByZSBjbGFzcz0="brush:java;">$stime = microtime(true);
require "./phar-test.phar";
$etime = microtime(true);
$total = $etime - $stime;
echo "phar total:".$total."s";执行后,效率如下
localhost:phar ugg$ php test_phar_load.php phar total:0.0044760704040527s localhost:phar ugg$ php test_phar_load.php phar total:0.0051448345184326s localhost:phar ugg$ php test_phar_load.php phar total:0.0043849945068359s localhost:phar ugg$ vim test_phar_load.php
平均加载4.7毫秒
对比直接源代码引用方式。
$stime = microtime(true); require "./src/index.php"; $etime = microtime(true); $total = $etime - $stime; echo "src total:".$total."s\n";
执行后,效率如下
localhost:phar ugg$ php test_src_load.phpsrc total:0.0026230812072754s localhost:phar ugg$ php test_src_load.phpsrc total:0.0026969909667969s localhost:phar ugg$ php test_src_load.phpsrc total:0.0025439262390137s
平均加载2.6毫秒
结论:通过加载速度对比,phar加载方式比直接文件加载方式慢了不少,几乎直接引用文件所耗时间的两倍。同时我又在phar文件中加载一些干扰文件,使phar文件变大,发现在10k以内,这个load时间变化不大。当然我并没有把新增的文件放到存根内,这样做的目的,对于超过10K的目录,文件组织方式比如是autoload方式,而不会通过一个文件包含所有的文件。phar加载时间是src直接加载的1.8倍左右。
第二:执行速度检验
phar方式,代码如下
$stime = microtime(true); //require "phar://phar-test.phar"; require "phar-test.phar"; $sstime = microtime(true); for($i = 0; $ifor1to10000(); $number = number2Chinese("12345"); } $eetime = microtime(true); $etime = microtime(true); $total = $etime - $stime; $total2 = $eetime - $sstime; echo "phar load total:".$total."s\n"; echo "phar execution 10000 total:".$total2."s";执行效率如下
localhost:phar ugg$ php test_phar_functions.php phar load total:0.0047600269317627s phar execution 10000 total:0.00017499923706055s localhost:phar ugg$ php test_phar_functions.php phar load total:0.004863977432251s phar execution 10000 total:0.00017404556274414s localhost:phar ugg$ php test_phar_functions.php phar load total:0.004680871963501s phar execution 10000 total:0.00016689300537109s执行10000次的类方法,对象实例和对象方法,以及函数方法,总共时间消耗为0.17毫秒。
src执行效率
localhost:phar ugg$ php test_src_functions.php phar load total:0.0029089450836182s phar execution 10000 total:0.00019693374633789s localhost:phar ugg$ php test_src_functions.php phar load total:0.0028579235076904s phar execution 10000 total:0.0002140998840332s localhost:phar ugg$ php test_src_functions.php phar load total:0.0029168128967285s phar execution 10000 total:0.00019478797912598s执行10000次的类方法,对象实例和对象方法,以及函数方法,总共时间消耗为0.20毫秒。
小结:通过执行速度对比,发现是phar方式,执行速度,要比直接文件include方式,快了(0.20-0.17)/0.20*100=15%,phar方式执行速度快的具体原因没有找到,网上有份资料,apc+include_path设置 phar执行速度很快。https://github.com/ralphschindler/test-phar-performance-apc/。
总结:PHP归档phar方式,加载速度要慢于正常文件包含方式,但是执行速度要高于文件包含方式,如果配合include_path设置和APC或者OP方式,优化phar归档的加载速度,就能提升php的执行速度。下一步会做方面的尝试,1:构建大phar文件,实验加载速度,执行速度。2:了解phar加载原理和执行原理,3:包概念管理和依赖。
其他一些参考资料
PHP V5.3中新特性,创建并使用Phar归档。http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new4/
test-phar-performance-apc https://github.com/ralphschindler/test-phar-performance-apc/