Home  >  Article  >  Backend Development  >  PHP Performance Optimization Tool Chapter Benchmark Class Debugging Execution Time_PHP Tutorial

PHP Performance Optimization Tool Chapter Benchmark Class Debugging Execution Time_PHP Tutorial

WBOY
WBOYOriginal
2016-07-21 15:22:26972browse

这是PHP性能优化系列第二期,如何使用PEAR工具类Benchmark逐行获取代码或函数的执行时间。

工欲善其事,必先利其器!

如何安装PEAR和Benchmark

请参考PHP性能优化系列第一期 [PHP性能优化准备篇图解PEAR安装]

Benchmark工具类包说明

直接下载: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函数获取代码前后的微秒时间数再比较两个值的时间差,如下


但这种方法很有局限制,不能大范围的应用,而且每次都需要书写很多代码,适合于简单的调试。具体请查看PHP手册详细说明。

2,通过使用benchmark_Timer类获取代码前后执行的时间差,可以同时获取N行代码的执行时间,操作简单,只需要增加一个marker标记即可,请看下面Benchmark_Timer类的使用说明

如何使用Benchmark_Timer类

Benchmark_Timer类只需要在调试文件中增加Benchmark_Timer类初始化声明和marker标注,文件尾打印各个标注处的执行时间,实例如下

    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();


打印结果有两种方法:

一种是表格输出方式,$timer->display(); 如下图

php-performance-benchmark-timer

另外一种是手动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 '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'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表示开始和结束,其次是自定义标注 marker 01 marker 02等
2,time表示当前的微秒时间
3,diff表示上一个标记到当前标记的执行时间,这个就是我们需要获取的时间差,没错,看的就是这个值。
4,total表示执行到当前的整个时间

如何使用Benchmark_Iterate类

Benchmark_Iterate类用于调试函数执行的平均时间,与Benchmark_Timer类不同在于可以多次调用同一个函数获取其执行时间的平均值,实例如下:

    require_once "Benchmark/Iterate.php";$bench = new Benchmark_Iterate;function test($i){ echo $i;}$bench->run(100,"test",10);var_dump($bench ->get());


Get the average execution time by calling the test function 100 times. The results are as follows

    array1 => string '0.000486' (length=8)2 => string '0.000466' (length=8)............. ........(middle omitted) 99 => string '0.000479' (length=8)100 => string '0.000467' (length=8)'mean' => string '0.000476' (length=8)'iterations' => int 100


Result Description
1, each number represents the time of each call
2, mean represents the average time of function execution, the average time of calling the test function 100 times as above is 0.000476
3, iterations represents the number of function calls

How to use the Benchmark_Profiler class


The Benchmark_Profiler class is used to count the number of executions of a function and execution time, etc. Examples are as follows:

    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


The results are as follows

php-performance-benchmark-profiler

The Benchmark_Profiler class is not used much in actual performance debugging, because there are better tools than this, such as xDebuger, etc., so it can be ignored directly!

The Benchmark tool class is very useful for analyzing program performance issues during line-by-line debugging during debugging. The Benchmark_Timer class is mainly used to debug the time points of each code segment to optimize the program and improve the performance of the code by obtaining the execution time. I won’t discuss it in depth here. If you have any questions during use, please feel free to share it with us!

If you find this line-by-line debugging very tiring and hard, and if you want to grasp the performance of the program as a whole, this Benchmark debugging tool cannot meet your needs. We will discuss PHP performance debugging tools in the next issue Installation and use of xDebuger.

Related information

microtime

(PHP 3, PHP 4, PHP 5)

microtime -- Returns the current Unix timestamp and microseconds
Description
mixed microtime ( [bool get_as_float] )

microtime() Returns the current Unix timestamp and microseconds Number of seconds. This function is only available under operating systems that support the gettimeofday() system call.
If called without optional parameters, this function returns a string in the format "msec sec", where sec is the number of seconds since the Unix epoch (0:00:00 January 1, 1970 GMT) , msec is the microsecond part. Both parts of the string are returned in seconds.

If the get_as_float parameter is given and its value is equivalent to TRUE, microtime() will return a floating point number.

Note: The get_as_float parameter is newly added in PHP 5.0.0.

Extended information
PHP Benchmark/Timer Class
PHP Benchmark
Benchmark and Optimize PHP Script Speed

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/324694.htmlTechArticleThis is the second issue of the PHP performance optimization series. How to use the PEAR tool class Benchmark to obtain the execution of code or functions line by line. time. If a worker wants to do his job well, he must first sharpen his tools! How to install PEAR and Benchma...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn