PHP性能優(yōu)化工具篇Benchmark類調(diào)試執(zhí)行時(shí)間
這是PHP性能優(yōu)化系列第二期,如何使用PEAR工具類Benchmark逐行獲取代碼或函數(shù)的執(zhí)行時(shí)間。
工欲善其事,必先利其器!
如何安裝PEAR和Benchmark
請(qǐng)參考PHP性能優(yōu)化系列第一期 [PHP性能優(yōu)化準(zhǔn)備篇圖解PEAR安裝]
Benchmark工具類包說(shuō)明
直接下載:http://pear.php.net/package/Benchmark/download
Benchmark工具類包共有三個(gè)文件,分別是Timer.php、Iterate.php和Profiler.php,三個(gè)工具類功能相同,只是側(cè)重點(diǎn)不同,都是用于調(diào)試代碼獲取程序的執(zhí)行時(shí)間。
1,Benchmark_Timer類原理與通過(guò)microtime函數(shù)獲取微秒時(shí)間再比較前后兩個(gè)時(shí)間值的差相同。
2,Benchmark_Iterate類用于調(diào)試函數(shù)的平均執(zhí)行時(shí)間。
3,Benchmark_Profiler類用于統(tǒng)計(jì)代碼和函數(shù)的執(zhí)行時(shí)間以及函數(shù)的調(diào)用次數(shù)。
具體使用方法三個(gè)文件內(nèi)都有詳細(xì)的使用實(shí)例。
如何獲取一行或一段代碼的執(zhí)行時(shí)間
1,通常使用microtime函數(shù)獲取代碼前后的微秒時(shí)間數(shù)再比較兩個(gè)值的時(shí)間差,如下
- <?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";?>
但這種方法很有局限制,不能大范圍的應(yīng)用,而且每次都需要書寫很多代碼,適合于簡(jiǎn)單的調(diào)試。具體請(qǐng)查看PHP手冊(cè)詳細(xì)說(shuō)明。
2,通過(guò)使用benchmark_Timer類獲取代碼前后執(zhí)行的時(shí)間差,可以同時(shí)獲取N行代碼的執(zhí)行時(shí)間,操作簡(jiǎn)單,只需要增加一個(gè)marker標(biāo)記即可,請(qǐng)看下面Benchmark_Timer類的使用說(shuō)明
如何使用Benchmark_Timer類
Benchmark_Timer類只需要在調(diào)試文件中增加Benchmark_Timer類初始化聲明和marker標(biāo)注,文件尾打印各個(gè)標(biāo)注處的執(zhí)行時(shí)間,實(shí)例如下
- 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();
打印結(jié)果有兩種方法:
一種是表格輸出方式,$timer->display(); 如下圖
另外一種是手動(dòng)var_dump或print_r打印,$timer->getProfiling();,print_r函數(shù)打印如下圖
- 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)
結(jié)果說(shuō)明
1,name表示標(biāo)注名稱,如上 包含兩個(gè)特殊標(biāo)注start和stop表示開始和結(jié)束,其次是自定義標(biāo)注 marker 01 marker 02等
2,time表示當(dāng)前的微秒時(shí)間
3,diff表示上一個(gè)標(biāo)記到當(dāng)前標(biāo)記的執(zhí)行時(shí)間,這個(gè)就是我們需要獲取的時(shí)間差,沒(méi)錯(cuò),看的就是這個(gè)值。
4,total表示執(zhí)行到當(dāng)前的整個(gè)時(shí)間
如何使用Benchmark_Iterate類
Benchmark_Iterate類用于調(diào)試函數(shù)執(zhí)行的平均時(shí)間,與Benchmark_Timer類不同在于可以多次調(diào)用同一個(gè)函數(shù)獲取其執(zhí)行時(shí)間的平均值,實(shí)例如下:
- require_once "Benchmark/Iterate.php";$bench = new Benchmark_Iterate;function test($i){ echo $i;}$bench->run(100,"test",10);var_dump($bench->get());
通過(guò)調(diào)用test函數(shù)100次獲取平均執(zhí)行時(shí)間,結(jié)果如下
- 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
結(jié)果說(shuō)明
1,每個(gè)數(shù)字表示每次調(diào)用的時(shí)間
2,mean表示函數(shù)執(zhí)行的平均時(shí)間,如上調(diào)用100次test函數(shù)的平均時(shí)間為0.000476
3,iterations表示函數(shù)調(diào)用的次數(shù)
如何使用Benchmark_Profiler類
Benchmark_Profiler類用于統(tǒng)計(jì)函數(shù)的執(zhí)行次數(shù)和執(zhí)行時(shí)間等,實(shí)例如下:
- 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
結(jié)果如下

Benchmark_Profiler類在實(shí)際性能調(diào)試中使用并不多,因?yàn)檫€有比這個(gè)更好的工具,如xDebuger等,因此可直接忽略!
Benchmark 工具類在使用調(diào)試中針對(duì)逐行調(diào)試來(lái)分析程序性能問(wèn)題非常實(shí)用,主要使用Benchmark_Timer類調(diào)試各代碼段的時(shí)間點(diǎn),以通過(guò)獲取執(zhí)行時(shí)間來(lái)優(yōu)化程序提高代碼的性能。這里就不再深入討論,如果在使用的過(guò)程中有什么問(wèn)題歡迎大家一起交流!
如果你發(fā)現(xiàn)這種逐行調(diào)試很累很辛苦,如果你想從整體上把握程序的性能情況,這個(gè)Benchmark類調(diào)試工具就不能滿足你的需求,下期將討論P(yáng)HP性能調(diào)試工具xDebuger的安裝與使用。
相關(guān)資料
microtime
(PHP 3, PHP 4, PHP 5)
microtime -- 返回當(dāng)前 Unix 時(shí)間戳和微秒數(shù)
說(shuō)明
mixed microtime ( [bool get_as_float] )
microtime() 當(dāng)前 Unix 時(shí)間戳以及微秒數(shù)。本函數(shù)僅在支持 gettimeofday() 系統(tǒng)調(diào)用的操作系統(tǒng)下可用。
如果調(diào)用時(shí)不帶可選參數(shù),本函數(shù)以 "msec sec" 的格式返回一個(gè)字符串,其中 sec 是自 Unix 紀(jì)元(0:00:00 January 1, 1970 GMT)起到現(xiàn)在的秒數(shù),msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。
如果給出了 get_as_float 參數(shù)并且其值等價(jià)于 TRUE,microtime() 將返回一個(gè)浮點(diǎn)數(shù)。
注意: get_as_float 參數(shù)是 PHP 5.0.0 新加的。
擴(kuò)展資料
PHP Benchmark/Timer Class
PHP Benchmark
Benchmark and Optimize PHP Script Speed
相關(guān)文章
關(guān)于laravel5.5的定時(shí)任務(wù)詳解(demo)
今天小編就為大家分享一篇關(guān)于laravel5.5的定時(shí)任務(wù)詳解(demo),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
php語(yǔ)言中使用json的技巧及json的實(shí)現(xiàn)代碼詳解
json是一種比較流行的數(shù)據(jù)交換格式之一,各大API網(wǎng)站均支持json。通過(guò)本篇文章給大家介紹php語(yǔ)言中使用json技巧以及php語(yǔ)言中json的實(shí)現(xiàn),對(duì)php語(yǔ)言中使用json技巧及json的實(shí)現(xiàn)代碼詳解感興趣的朋友一起來(lái)本文學(xué)習(xí)學(xué)習(xí)吧2015-10-10
PhpStorm2020.1 安裝 debug - Postman 調(diào)用的詳細(xì)教程
這篇文章主要介紹了PhpStorm2020.1 安裝 debug - Postman 調(diào)用的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
分享ThinkPHP3.2中關(guān)聯(lián)查詢解決思路
這篇文章主要介紹了ThinkPHP3.2中關(guān)聯(lián)查詢解決思路的相關(guān)資料,需要的朋友可以參考下2015-09-09
php設(shè)計(jì)模式之工廠模式用法經(jīng)典實(shí)例分析
這篇文章主要介紹了php設(shè)計(jì)模式之工廠模式用法,結(jié)合具體實(shí)例形式分析了php工廠模式相關(guān)原理、定義、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
PHP+jQuery 注冊(cè)模塊的改進(jìn)(二):郵箱激活
本文是PHP+jQuery 注冊(cè)模塊的改價(jià)的第二篇,主要是繼續(xù)完善郵箱激活賬號(hào)方面的功能,非常的詳細(xì),有需要的朋友可以參考下2014-10-10
使用PHP Socket 編程模擬Http post和get請(qǐng)求
這篇文章主要介紹了使用PHP Socket 編程模擬Http post和get請(qǐng)求 ,需要的朋友可以參考下2014-11-11

