首页 > 编程语言 >PHP性能优化工具篇Benchmark类调试执行时间

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

时间:2023-05-19 17:04:43浏览次数:37  
标签:string Benchmark Timer length marker PHP 调试


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

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

如何安装PEAR和Benchmark

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

Benchmark工具类包说明

直接下载/package/Benchmark/download
Benchmark工具类包共有三个文件,分别是Timer.php、Iterate.php和Profiler.php,三个工具类功能相同,只是侧重点不同,都是用于调试代码获取程序的执行时间。

1,Benchmark_Timer类原理与通过microtime函数获取微秒时间再比较前后两个时间值的差相同。
2,Benchmark_Iterate类用于调试函数的平均执行时间。
3,Benchmark_Profiler类用于统计代码和函数的执行时间以及函数的调用次数。

具体使用方法三个文件内都有详细的使用实例。

如何获取一行或一段代码的执行时间

1,通常使用microtime函数获取代码前后的微秒时间数再比较两个值的时间差,如下

<?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";?>

  但这种方法很有局限制,不能大范围的应用,而且每次都需要书写很多代码,适合于简单的调试。具体请查看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(); 如下图




另外一种是手动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());

  通过调用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' => int 100

  结果说明
1,每个数字表示每次调用的时间
2,mean表示函数执行的平均时间,如上调用100次test函数的平均时间为0.000476
3,iterations表示函数调用的次数
如何使用Benchmark_Profiler类

Benchmark_Profiler类用于统计函数的执行次数和执行时间等,实例如下:

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

  结果如下

  

  Benchmark_Profiler类在实际性能调试中使用并不多,因为还有比这个更好的工具,如xDebuger等,因此可直接忽略!

Benchmark 工具类在使用调试中针对逐行调试来分析程序性能问题非常实用,主要使用Benchmark_Timer类调试各代码段的时间点,以通过获取执行时间来优化程序提高代码的性能。这里就不再深入讨论,如果在使用的过程中有什么问题欢迎大家一起交流!

如果你发现这种逐行调试很累很辛苦,如果你想从整体上把握程序的性能情况,这个Benchmark类调试工具就不能满足你的需求,下期将讨论PHP性能调试工具xDebuger的安装与使用。

相关资料
microtime
(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 新加的。

扩展资料
PHP Benchmark/Timer Class
PHP Benchmark
Benchmark and Optimize PHP Script Speed

标签:string,Benchmark,Timer,length,marker,PHP,调试
From: https://blog.51cto.com/u_2700990/6313952

相关文章

  • nodejs 解析php的session_decode 的module(session_decode.js)
    文件名:session_decode.js//exports.session_decode=function(){//varmessage="Hellofromtheohaitheremodule";//returnmessage;//};exports.session_decode=function(data){//*example:session_decode('firstName|s:5:&quo......
  • 【ThinkPHP6系列学习-3】模板渲染
    视图功能由\think\View类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出),如果需要使用其它的模板引擎需要单独安装相应的模板引擎扩展。视图相关的配置在配置目录的view.php配置文件中进行定义。通常可以直接使用think\faca......
  • 【ThinkPHP6系列学习-1】下载并部署ThinkPHP6
    一、下载ThinkPHP6在指定目录(www目录)下打开cmd,使用composer下载thinkphp6,命令后面的thinkphp6就是下载的目录名,可以随意修改。composercreate-projecttopthink/thinkthinkphp6二、目录结构下载后,查看目录结构,tp6的目录结构和tp5不同,默认是单应用(只有一个模块),如果需要多应......
  • java中把对象序列化成php序列化的字符串以及把php序列化的字符串反序列化为java对象的
    依赖第三方库phprpc序列化成php格式的字符串很简单,直接调用org.phprpc.util.PHPSerializer.serializer方法就行,有问题的是反序列化php格式的字符串为List或Map对象时,得到的是个AssocArray对象,需要写方法进行转换。通过下面这个方法可以实现转为java对象。publicstati......
  • php第三方库:用simple_html_dom解析html(php)
    一,第三方库的地址:https://github.com/voku/simple_html_dom二,安装库:simple_html_dom:1,安装[lhdop@blogparsehtml]$composerrequirevoku/simple_html_domInfofromhttps://repo.packagist.org:#StandWithUkraine…2,安装完成后查看安装成功的文件:[lhdop@blog......
  • Mobile Web调试工具Weinre
    现在、将来,用移动设备上网越来越成为主流。但对于开发者们来说,移动web的调试一直是个难题,前期可以使用模拟器来协助调试,但到了真机调试阶段就让人非常头痛。而Weinre就是解决这难题的利器。Weinre的本意是WebInspectorRemote,它是一种远程调试工具。功能与Firebug、Webkiti......
  • 转载【环境搭建】docker+nginx部署PHP
      目的使用docker容器完成nginx的安装以及部署PHP网页步骤一、安装nginx1.拉取Nginx镜像dockerpullnginx//拉取镜像dockerimages//查看本地镜像这里注意需要记一下nginx的IMAGEID,我这里的ID是605c2.创建Nginx容器dockerrun--nam......
  • Postman调试grpc
    转载请注明出处:1.检查自己的postman是否支持grpc,通过File->new->,出现如下图,则表示支持: 2.点击上图的grpc就会自动创建一个grpc的request3.导入proto文件,并点击import4.填写请求参数,选择grpc方法,生成请求的message,发起调用,请求并响应的示例如下 注意......
  • grafana+ prometheus+php 监控系统实践
    背景团队在开发流媒体服务,需要实现一个监控在线人数的功能,可以看到历史有多少人在线,当前有多少人在线的功能。如果用mysql等关系型数据库来实现,可以用事件记录日志,然后通过PHP加上一些绘图的插件来实现,但这种方式并不好,首先用关系型数据库随着时间累积,会存在数据量越来越大,导致查......
  • Grafana+prometheus+php 自动创建监控图
    背景在grafana+prometheus+php监控系统实践文章当中已经实现了我们的第一个监控图表,现在我们有了一个新需求,需要对多个节点实现不同的监控,以及一个汇总的监控;按照我们之前手动创建仪表盘的方法,每新增一个节点都需要手动去修改prometheus配置,并且需要去grafana系统当中创建一个仪......