PHP性能优化工具篇Benchmark类调试执行时间
这是PHP性能优化系列第二期,如何使用PEAR工具类Benchmark逐行获取代码或函数的执行时间。
工欲善其事,必先利其器!
请参考PHP性能优化系列第一期[PHP性能优化准备篇图解PEAR安装]
直接下载:http://pear.php.net/package/Benchmark/download
Benchmark工具类包共有三个文件,分别是Timer.php、Iterate.php和Profiler.php,三个工具类功能相同,只是侧重点不同,都是用于调试代码获取程序的执行时间。
1,Benchmark_Timer类原理与通过microtime函数获取微秒时间再比较前后两个时间值的差相同。
2,Benchmark_Iterate类用于调试函数的平均执行时间。
3,Benchmark_Profiler类用于统计代码和函数的执行时间以及函数的调用次数。
具体使用方法三个文件内都有详细的使用实例。
1,通常使用microtime函数获取代码前后的微秒时间数再比较两个值的时间差,如下
- <?phpfunctionmicrotime_float(){ list($usec,$sec)=explode("",microtime()); return((float)$usec+(float)$sec);} $time_start=microtime_float(); usleep(100); $time_end=microtime_float();$time=$time_end-$time_start; echo"Didnothingin$timeseconds\n";?>
但这种方法很有局限制,不能大范围的应用,而且每次都需要书写很多代码,适合于简单的调试。具体请查看PHP手册详细说明。
2,通过使用benchmark_Timer类获取代码前后执行的时间差,可以同时获取N行代码的执行时间,操作简单,只需要增加一个marker标记即可,请看下面Benchmark_Timer类的使用说明
Benchmark_Timer类只需要在调试文件中增加Benchmark_Timer类初始化声明和marker标注,文件尾打印各个标注处的执行时间,实例如下
- require_once"Benchmark/Timer.php";$timer=newBenchmark_Timer();$timer->start();$timer->setMarker("marker01");usleep(1);$timer->setMarker("marker02");usleep(2);$timer->setMarker("marker03");usleep(3);$timer->stop();$timer->display();
打印结果有两种方法:
一种是表格输出方式,$timer->display();如下图
另外一种是手动var_dump或print_r打印,$timer->getProfiling();,print_r函数打印如下图
- array0=>array"name"=>string"Start"(length=5)"time"=>string"1265942405.31334800"(length=19)"diff"=>string"-"(length=1)"total"=>string"-"(length=1)1=>array"name"=>string"marker01"(length=9)"time"=>string"1265942405.31374400"(length=19)"diff"=>string"0.000396"(length=8)"total"=>string"0.000396"(length=8)2=>array"name"=>string"marker02"(length=9)"time"=>string"1265942405.31423000"(length=19)"diff"=>string"0.000486"(length=8)"total"=>string"0.000882"(length=8)3=>array"name"=>string"marker03"(length=9)"time"=>string"1265942405.31519200"(length=19)"diff"=>string"0.000962"(length=8)"total"=>string"0.001844"(length=8)4=>array"name"=>string"Stop"(length=4)"time"=>string"1265942405.31623800"(length=19)"diff"=>string"0.001046"(length=8)"total"=>string"0.002890"(length=8)
结果说明
1,name表示标注名称,如上包含两个特殊标注start和stop表示开始和结束,其次是自定义标注marker01marker02等
2,time表示当前的微秒时间
3,diff表示上一个标记到当前标记的执行时间,这个就是我们需要获取的时间差,没错,看的就是这个值。
4,total表示执行到当前的整个时间
Benchmark_Iterate类用于调试函数执行的平均时间,与Benchmark_Timer类不同在于可以多次调用同一个函数获取其执行时间的平均值,实例如下:
- require_once"Benchmark/Iterate.php";$bench=newBenchmark_Iterate;functiontest($i){ echo$i;}$bench->run(100,"test",10);var_dump($bench->get());
通过调用test函数100次获取平均执行时间,结果如下
- array1=>string"0.000486"(length=8)2=>string"0.000466"(length=8).............................(中间省略)99=>string"0.000479"(length=8)100=>string"0.000467"(length=8)"mean"=>string"0.000476"(length=8)"iterations"=>int100
结果说明
1,每个数字表示每次调用的时间
2,mean表示函数执行的平均时间,如上调用100次test函数的平均时间为0.000476
3,iterations表示函数调用的次数
如何使用Benchmark_Profiler类
Benchmark_Profiler类用于统计函数的执行次数和执行时间等,实例如下:
- require_once"Benchmark/Profiler.php";$profiler=newBenchmark_Profiler(TRUE);functionmyFunction(){ global$profiler; $profiler->enterSection("myFunction"); //dosomething $profiler->leaveSection("myFunction"); return;}//dosomethingmyFunction();//domore
结果如下
Benchmark_Profiler类在实际性能调试中使用并不多,因为还有比这个更好的工具,如xDebuger等,因此可直接忽略!
Benchmark工具类在使用调试中针对逐行调试来分析程序性能问题非常实用,主要使用Benchmark_Timer类调试各代码段的时间点,以通过获取执行时间来优化程序提高代码的性能。这里就不再深入讨论,如果在使用的过程中有什么问题欢迎大家一起交流!
如果你发现这种逐行调试很累很辛苦,如果你想从整体上把握程序的性能情况,这个Benchmark类调试工具就不能满足你的需求,下期将讨论PHP性能调试工具xDebuger的安装与使用。
microtime
(PHP3,PHP4,PHP5)
microtime--返回当前Unix时间戳和微秒数
说明
mixedmicrotime([boolget_as_float])
microtime()当前Unix时间戳以及微秒数。本函数仅在支持gettimeofday()系统调用的操作系统下可用。
如果调用时不带可选参数,本函数以"msecsec"的格式返回一个字符串,其中sec是自Unix纪元(0:00:00January1,1970GMT)起到现在的秒数,msec是微秒部分。字符串的两部分都是以秒为单位返回的。
如果给出了get_as_float参数并且其值等价于TRUE,microtime()将返回一个浮点数。
注意:get_as_float参数是PHP5.0.0新加的。
PHPBenchmark/TimerClass
PHPBenchmark
BenchmarkandOptimizePHPScriptSpeed
相关文章
- php导出excel表格_phpspreadsheet导出
- php实现带权限的增删改查功能
- MySQL异常捕获:使用PHP技巧轻松完成(php捕获mysql异常)
- 使用Redis集群提升PHP性能(redis集群php)
- PHP实现MySQL分页查询功能(php分页查询mysql)
- PHP与MySQL无缝对接,构建强大数据库应用(php整合mysql)
- 的应用利用PHP中MySQL函数实现功能强大的数据库操作(php中mysql函数)
- PHP在Linux上安装:轻松快捷(php安装包linux)
- PHP在Linux系统中的安装与下载(php下载linux)
- PHP和Linux技术结合的灵活力量(php和linux)
- 实现Linux版PHP动态编译——一案子的艰辛实践(php编译linux)
- PHP操作MySQL数据库的完整指南(php读写mysql)
- PHP轻松获取MySQL错误信息教程(php获取mysql错误)
- PHP开发者必须了解的Linux常识(php开发linux)
- PHP编译Redis:提升网站性能的利器(php编译redis)
- PHP文件快速导入MySQL数据库(php文件导入mysql)
- 用Redis作为PHP缓存:提高性能和效率(php中redis做缓存)
- Linux部署PHP:极速入门指南(linux如何部署php)
- PHP操作MySQL数据库详解,快速学习调用方法(php怎么调用mysql)
- 善数据库性能用PHP连接MSSQL提升数据库性能(php连接mssql改)
- PHP与MSSQL联动——更自由的数据空间(php mssql 空间)
- PHP与MySQL:兼容性更好、更强大的灵活性(php与mysql 优点)
- PHP与MySQL实现三表关联操作(mysql三表关联pHP)
- 在PHP中使用Redis提高网站性能(在php中使用redis)
- PHP操作Redis快速读写数据(redis 读写 php)
- 用定制的PHP应用程序来获取Web服务器的状态信息
- 使用PHP数组实现无限分类,不使用数据库,不使用递归.
- 简单的PHP缓存设计实现代码
- php数据结构与算法(PHP描述)快速排序quicksort
- php启动时候提示PHPstartup的解决方法
- 解析在PHP中使用全局变量的几种方法
- php中的PHP_EOL换行符详细解析
- 用PHP实现弹出消息提示框的两种方法
- 最常用的8款PHP调试工具