一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP性能優(yōu)化工具篇Benchmark類調(diào)試執(zhí)行時間

PHP性能優(yōu)化工具篇Benchmark類調(diào)試執(zhí)行時間

2019-12-19 14:49PHP教程網(wǎng) PHP教程

這是PHP性能優(yōu)化系列第二期,如何使用PEAR工具類Benchmark逐行獲取代碼或函數(shù)的執(zhí)行時間

這是PHP性能優(yōu)化系列第二期,如何使用PEAR工具類Benchmark逐行獲取代碼或函數(shù)的執(zhí)行時間。

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

如何安裝PEAR和Benchmark

請參考PHP性能優(yōu)化系列第一期 [PHP性能優(yōu)化準(zhǔn)備篇圖解PEAR安裝]

Benchmark工具類包說明

直接下載:http://pear.php.net/package/Benchmark/download
Benchmark工具類包共有三個文件,分別是Timer.php、Iterate.php和Profiler.php,三個工具類功能相同,只是側(cè)重點不同,都是用于調(diào)試代碼獲取程序的執(zhí)行時間。

1,Benchmark_Timer類原理與通過microtime函數(shù)獲取微秒時間再比較前后兩個時間值的差相同。
2,Benchmark_Iterate類用于調(diào)試函數(shù)的平均執(zhí)行時間。
3,Benchmark_Profiler類用于統(tǒng)計代碼和函數(shù)的執(zhí)行時間以及函數(shù)的調(diào)用次數(shù)。

具體使用方法三個文件內(nèi)都有詳細的使用實例。

如何獲取一行或一段代碼的執(zhí)行時間

1,通常使用microtime函數(shù)獲取代碼前后的微秒時間數(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)用,而且每次都需要書寫很多代碼,適合于簡單的調(diào)試。具體請查看PHP手冊詳細說明。

2,通過使用benchmark_Timer類獲取代碼前后執(zhí)行的時間差,可以同時獲取N行代碼的執(zhí)行時間,操作簡單,只需要增加一個marker標(biāo)記即可,請看下面Benchmark_Timer類的使用說明

如何使用Benchmark_Timer類

Benchmark_Timer類只需要在調(diào)試文件中增加Benchmark_Timer類初始化聲明和marker標(biāo)注,文件尾打印各個標(biāo)注處的執(zhí)行時間,實例如下

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(); 如下圖

PHP性能優(yōu)化工具篇Benchmark類調(diào)試執(zhí)行時間

另外一種是手動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é)果說明
1,name表示標(biāo)注名稱,如上 包含兩個特殊標(biāo)注start和stop表示開始和結(jié)束,其次是自定義標(biāo)注 marker 01 marker 02等
2,time表示當(dāng)前的微秒時間
3,diff表示上一個標(biāo)記到當(dāng)前標(biāo)記的執(zhí)行時間,這個就是我們需要獲取的時間差,沒錯,看的就是這個值。
4,total表示執(zhí)行到當(dāng)前的整個時間

如何使用Benchmark_Iterate類

Benchmark_Iterate類用于調(diào)試函數(shù)執(zhí)行的平均時間,與Benchmark_Timer類不同在于可以多次調(diào)用同一個函數(shù)獲取其執(zhí)行時間的平均值,實例如下:

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


通過調(diào)用test函數(shù)100次獲取平均執(zhí)行時間,結(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é)果說明
1,每個數(shù)字表示每次調(diào)用的時間
2,mean表示函數(shù)執(zhí)行的平均時間,如上調(diào)用100次test函數(shù)的平均時間為0.000476
3,iterations表示函數(shù)調(diào)用的次數(shù)

如何使用Benchmark_Profiler類

Benchmark_Profiler類用于統(tǒng)計函數(shù)的執(zhí)行次數(shù)和執(zhí)行時間等,實例如下:

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é)果如下

PHP性能優(yōu)化工具篇Benchmark類調(diào)試執(zhí)行時間

Benchmark_Profiler類在實際性能調(diào)試中使用并不多,因為還有比這個更好的工具,如xDebuger等,因此可直接忽略!

Benchmark 工具類在使用調(diào)試中針對逐行調(diào)試來分析程序性能問題非常實用,主要使用Benchmark_Timer類調(diào)試各代碼段的時間點,以通過獲取執(zhí)行時間來優(yōu)化程序提高代碼的性能。這里就不再深入討論,如果在使用的過程中有什么問題歡迎大家一起交流!

如果你發(fā)現(xiàn)這種逐行調(diào)試很累很辛苦,如果你想從整體上把握程序的性能情況,這個Benchmark類調(diào)試工具就不能滿足你的需求,下期將討論PHP性能調(diào)試工具xDebuger的安裝與使用。

相關(guān)資料

microtime
(PHP 3, PHP 4, PHP 5)

microtime -- 返回當(dāng)前 Unix 時間戳和微秒數(shù)
說明
mixed microtime ( [bool get_as_float] )

microtime() 當(dāng)前 Unix 時間戳以及微秒數(shù)。本函數(shù)僅在支持 gettimeofday() 系統(tǒng)調(diào)用的操作系統(tǒng)下可用。
如果調(diào)用時不帶可選參數(shù),本函數(shù)以 "msec sec" 的格式返回一個字符串,其中 sec 是自 Unix 紀元(0:00:00 January 1, 1970 GMT)起到現(xiàn)在的秒數(shù),msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。

如果給出了 get_as_float 參數(shù)并且其值等價于 TRUE,microtime() 將返回一個浮點數(shù)。

注意: get_as_float 參數(shù)是 PHP 5.0.0 新加的。

擴展資料
PHP Benchmark/Timer Class 
PHP Benchmark 
Benchmark and Optimize PHP Script Speed

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 娇小老少配xxxxx性视频 | 精品国产一区二区三区久久久蜜臀 | 青青草99热久久 | 小鸟酱在线播放 | 男女精品视频 | 五月天精品视频播放在线观看 | 亚洲精品久久久久AV无码 | 亚洲26uuuu最新地址 | 4444亚洲国产成人精品 | 亚洲haose在线观看 | 人人人人人看碰人人免费 | gayrb免费漫画入口 | 日本黄色大片免费观看 | 日本一本草久p | 日本人成动漫网站在线观看 | 久久er99热精品一区二区 | 日韩毛片免费线上观看 | 欧美精品99久久久久久人 | 猫咪av| 欧美干b视频 | 98成人| 国产免费资源 | 美女扒开屁股让男人进去 | 肉色欧美久久久久久久蜜桃 | 人人做人人爽人人爱 | 羞羞私人影院可以直接免费观影吗 | 日本-区二区三区免费精品 日本破处 | 日本人成大片在线 | 精品久久久久久午夜 | 免费看a片毛片 | 免费观看欧美一级高清 | 亚洲AV精品无码喷水直播间 | 99久在线 | 四虎国产精品免费入口 | 日韩毛片免费线上观看 | 青青草精品 | 肥奶丰熟肥妇 | 国产综合图区 | 亚洲人成激情在线播放 | 图片专区亚洲欧美另类 | 国内精品 大秀视频 日韩精品 |