源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

PHP性能优化工具篇Benchmark类调试执行时间

  • 时间:2021-01-11 00:21 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:PHP性能优化工具篇Benchmark类调试执行时间
这是PHP性能优化系列第二期,如何使用PEAR工具类Benchmark逐行获取代码或函数的执行时间。 工欲善其事,必先利其器! [b]如何安装PEAR和Benchmark[/b] 请参考PHP性能优化系列第一期 [PHP性能优化准备篇图解PEAR安装] [b]Benchmark工具类包说明[/b] 直接下载:[url=http://pear.php.net/package/Benchmark/download]http://pear.php.net/package/Benchmark/download[/url] Benchmark工具类包共有三个文件,分别是Timer.php、Iterate.php和Profiler.php,三个工具类功能相同,只是侧重点不同,都是用于调试代码获取程序的执行时间。 1,Benchmark_Timer类原理与通过microtime函数获取微秒时间再比较前后两个时间值的差相同。 2,Benchmark_Iterate类用于调试函数的平均执行时间。 3,Benchmark_Profiler类用于统计代码和函数的执行时间以及函数的调用次数。 具体使用方法三个文件内都有详细的使用实例。 [b]如何获取一行或一段代码的执行时间[/b] 1,通常使用microtime函数获取代码前后的微秒时间数再比较两个值的时间差,如下 [list=1]<?phpfunction microtime_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 "Did nothing in $time seconds\n";?>[/list] 但这种方法很有局限制,不能大范围的应用,而且每次都需要书写很多代码,适合于简单的调试。具体请查看PHP手册详细说明。 2,通过使用benchmark_Timer类获取代码前后执行的时间差,可以同时获取N行代码的执行时间,操作简单,只需要增加一个marker标记即可,请看下面Benchmark_Timer类的使用说明 [b]如何使用Benchmark_Timer类[/b] Benchmark_Timer类只需要在调试文件中增加Benchmark_Timer类初始化声明和marker标注,文件尾打印各个标注处的执行时间,实例如下 [list=1]require_once 'Benchmark/Timer.php';$timer = new Benchmark_Timer();$timer->start();$timer->setMarker("marker 01");usleep(1);$timer->setMarker("marker 02");usleep(2);$timer->setMarker("marker 03");usleep(3);$timer->stop();$timer->display();[/list] 打印结果有两种方法: [b]一种是表格输出方式[/b],$timer->display(); 如下图 [img]http://files.jb51.net/file_images/article/201112/2011120600535210.png[/img] [b]另外一种是手动var_dump或print_r打印[/b],$timer->getProfiling();,print_r函数打印如下图 [list=1]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 'marker 01' (length=9)'time' => string '1265942405.31374400' (length=19)'diff' => string '0.000396' (length=8)'total' => string '0.000396' (length=8)2 =>array'name' => string 'marker 02' (length=9)'time' => string '1265942405.31423000' (length=19)'diff' => string '0.000486' (length=8)'total' => string '0.000882' (length=8)3 =>array'name' => string 'marker 03' (length=9)'time' => string '1265942405.31519200' (length=19)'diff' => string '0.000962' (length=8)'total' => string '0.001844' (length=8)4 =>array'[b]name[/b]' => string 'Stop' (length=4)'[b]time[/b]' => string '1265942405.31623800' (length=19)'[b]diff[/b]' => string '0.001046' (length=8)'[b]total[/b]' => string '0.002890' (length=8)[/list] [b]结果说明[/b] 1,name表示标注名称,如上 包含两个特殊标注start和stop表示开始和结束,其次是自定义标注 marker 01 marker 02等 2,time表示当前的微秒时间 3,[b]diff表示上一个标记到当前标记的执行时间[/b],这个就是我们需要获取的时间差,没错,看的就是这个值。 4,total表示执行到当前的整个时间 [b]如何使用Benchmark_Iterate类[/b] Benchmark_Iterate类用于调试函数执行的平均时间,与Benchmark_Timer类不同在于可以多次调用同一个函数获取其执行时间的平均值,实例如下: [list=1]require_once "Benchmark/Iterate.php";$bench = new Benchmark_Iterate;function test($i){    echo $i;}$bench->run(100,"test",10);var_dump($bench->get());[/list] 通过调用test函数100次获取平均执行时间,结果如下 [list=1]array1 => string '0.000486' (length=8)2 => string '0.000466' (length=8).............................(中间省略)99 => string '0.000479' (length=8)100 => string '0.000467' (length=8)'[b]mean[/b]' => string '0.000476' (length=8)'[b]iterations[/b]' => int 100[/list] [b]结果说明[/b] 1,每个数字表示每次调用的时间 2,mean表示函数执行的平均时间,如上调用100次test函数的平均时间为0.000476 3,iterations表示函数调用的次数 [b] 如何使用Benchmark_Profiler类[/b] Benchmark_Profiler类用于统计函数的执行次数和执行时间等,实例如下: [list=1]require_once 'Benchmark/Profiler.php';$profiler = new Benchmark_Profiler(TRUE);function myFunction() {    global $profiler;     $profiler->enterSection('myFunction');     //do something     $profiler->leaveSection('myFunction');     return;}//do somethingmyFunction();//do more[/list] [b]结果如下[/b] [img]http://files.jb51.net/file_images/article/201112/2011120600535211.png[/img] Benchmark_Profiler类在实际性能调试中使用并不多,因为还有比这个更好的工具,如xDebuger等,因此可直接忽略! Benchmark 工具类在使用调试中针对逐行调试来分析程序性能问题非常实用,主要使用Benchmark_Timer类调试各代码段的时间点,以通过获取执行时间来优化程序提高代码的性能。这里就不再深入讨论,如果在使用的过程中有什么问题欢迎大家一起交流! 如果你发现这种逐行调试很累很辛苦,如果你想从整体上把握程序的性能情况,这个Benchmark类调试工具就不能满足你的需求,下期将讨论PHP性能调试工具xDebuger的安装与使用。 [b]相关资料[/b] [b] microtime[/b] (PHP 3, PHP 4, PHP 5) microtime -- 返回当前 Unix 时间戳和微秒数 说明 mixed microtime ( [bool get_as_float] ) microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。 如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。 如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数。 注意: get_as_float 参数是 PHP 5.0.0 新加的。 [b]扩展资料[/b] [url=http://blueprint.intereactive.net/php-benchmark-timer-class/]PHP Benchmark/Timer Class [/url] [url=http://pear.php.net/package/Benchmark]PHP Benchmark [/url] [url=http://www.webdesign.org/web-programming/php/benchmark-and-optimize-php-script-speed.14875.html]Benchmark and Optimize PHP Script Speed[/url]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部