PHP 代码优化测试【Benchmark数据测试】
Benchmark
测试之前我们先来了解Benchmark。
直接下载:
Benchmark工具类包共有三个文件,分别是Timer.php、Iterate.php和Profiler.php,三个工具类功能相同,只是侧重点不同,都是用于调试代码获取程序的执行时间。
1,Benchmark_Timer类原理与通过microtime函数获取微秒时间再比较前后两个时间值的差相同。
2,Benchmark_Iterate类用于调试函数的平均执行时间。
3,Benchmark_Profiler类用于统计代码和函数的执行时间以及函数的调用次数。
我们用它来测试执行结果,使用它需要安装pear
1) $row[‘id’] =0比 $row[id]=0 快,次数越大越明显/生产环境( Linux )下测试1个数量级;
首先来测试直接写id的情况:
测试结果:
而当我们把$arr[id] = 0; 改为
测试结果为:
可以看到,提升速度比较明显,因此,我们要规范数组的字段,不能写有风险的代码,$arr[id]这样子写有很大的风险。
2) 递增(递减)一个预预定义的 局部变量 要比递增(递减)一个未定义的局部变量快;差别较大
还是上述的代码,循环部分我们改为:
执行耗时为:
而我们改为:
执行耗时:
耗时缩减挺多
3)在可行的情况下,避免 使用正则表达式 ,str_replace 函数比 preg_replace,差别还是很明显的
首先来看使用正则的情况下:
耗时:
而使用:
耗时会减少挺多:
同样我们可以延伸出,尽量使用php的函数去完成功能,那些函数底层c都是经过优化的,执行效率比较高。即: 尽量采用PHP内置函数,且选择效率高的函数
4)在有必要的时候使使用引用(&),测试差别较大,接近1个数量级
引用的话,就不用像正常传递变量那样,复制多一个变量, 而是直接使用地址即可。
我们先不用引用:
耗时:
而当我们在循环中改为:
耗时为:
时间上缩小了很多。
5 ) 判断字符串长度时,可用isset($str{15})代替strlen($str) < 15;因为isset()作为一种语言结构,而strlen()是函数,语言结构快于函数;
使用strlen($str)函数来判断,代码如下:
执行耗时:
而当我们使用
判断,将会加快很多,执行耗时:
6 ) $_SERVER[‘DOCUMENT_ROOT’]代替str_replace(‘//’,’/’,dirname(__FILE__) .’/’) ; wamp 测试无太大差别/Linux生产环境测试性能提升 500% (5倍)
首先我们先用 $path = str_replace(‘//’,’/’,dirname(__FILE__) .’/’); 测试:
执行耗时:
当改为:
执行耗时:
几乎不在毫秒级别内。耗时少很多。
7 ) 获取Unix时间戳时用$_SERVER[‘REQUEST_TIME’] 代替time(); 测试性能提升很多
首先我们使用time() 来获取:
执行耗时:
而改为:
的时候,执行耗时减少很多:
几乎不在毫秒级别内
其实还有很多其他的各种优化小细节,例如:
* foreach函数,没有用到键的时候,就不要加键。
* include 文件时尽量使用绝对路径,因为它避免了 PHP 去 include_path 里查找文件的速 度,解析操作系统路径所需的时间会更少。【测试 差别其实不明显】
* 用 单引号 (’’)代替 双引号 (””),单引号为强类型,将其中的所以字符都认作字符,而双引号的为弱类型,它会检测其中是否存在变量 【 测试差别不大,但是用双引号有风险】
* Apache 处理 PHP 脚本的速度要比静态页面慢 2-10 倍,因此尽量采用多的静态页面,少的脚本;PHP程序使用文件缓存性能会倍增【不用测试我们也知道,测试速度快很多】;
* 一般不建议启用auto_start( Session .auto_start:是否自动启用) ,因为创建Session需要消耗系统资源,我们通常只会在需要用到Sesson时,才会使用session_start函数来开启Session功能。
优化无止境…………………………………………………….