webgrind是一个网页版的性能分析工具,它的主要作用就是分析xdebug生成的cachegrind文件,以一种界面友好详尽的方式来展示性能数据。试用了一下感觉还是很不错的,鉴于网上并没有一个系统介绍,特写一篇文章:
webgrind官方定义翻译版:https://github.com/jokkedk/webgrind
==================================================================================
是性能分析工具xdebug的php web版。它实现了 kcachegrind 的部分功能,但安装简便,适用所有平台,性能优化。
另外它是 Google Summer of Code(Google编程之夏)2008的建议计划之一。
特点:
- 跨平台,简便
- 可以记录函数自身耗时self cost或者综合耗时inclusive cost(指的是函数自身耗时+调用其他函数耗时)
- 可以查看php函数耗时以及用户自定义函数耗时
- 可以查看任何函数在哪里以及被哪个调用
- 通过gprof2dot.py 生成了种调用图表 :https://github-camo.global.ssl.fastly.net/a264619233ac41fb21c34ff6bf728d3d0daab20c/687474703a2f2f77696b692e6a72666f6e736563612e676f6f676c65636f64652e636f6d2f6769742f6770726f6632646f745f736d616c6c2e706e67
安装:
1.解压,放入网站文件夹,然后进入相关路径即可。比如 http://localhost/webgrind.
2.xdebug是后台程序,所以首先要安装xdebug http://www.xdebug.org/docs/install
3在php.ini中做好设置:
xdebug.profiler_enable = 1
一直使用xdebug来分析脚本。0/1,--(yukon12345:如果设置为1那么每个被执行的脚本都会被分析。如果开启这项会影响性能较大)
xdebug.profiler_enable_trigger = 1
是否开启触发 。0/1,--是否启用添加url参数的形式来触发分析。比如. http://localhost/samplepage.php?XDEBUG_PROFILE(yukon12345:官网上XDEBUG_PROFILE后多了个冒号:,如果多了冒号会造成不会触发)
可以查看xdebug手册来获取更多信息: http://www.xdebug.org/docs/all_settings
配置:通过webgrind文件夹下的config.php可以做相关配置,但是需要与被默认安装并且配置正确的xdebug协同使用。
- $storageDir - 一个可以写入的文件夹路径。(yukon12345:存储分析后生成的 cachegrind文件,为空就是用系统tmp文件夹或者xdebug的tmp文件夹。)
- $profilerDir -如果没装xdebug,webgrind就会到此路径下分析里面的cachegrind文件。如果安装了xdebug那么会查找它的xdebug.profiler_output_dir。(默认是/tmp)
配置
如果是通过wamp自带安装的那么在php.ini中会有这些简单的设置选项,如果是手工安装那么安装好xdebug后只要在php.ini里增加下面的2,3项即可。
[xdebug]
xdebug.remote_enable = off
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir = "d:/wamp/tmp"
其中第1项是开启远程调试,这里先不讲,2,3项前面的译文已经解释。第4项是分析出的信息文件命名格式,%t代表时间,%p代表pid。
xdebug相关设置可以通过phpinfo() 开快查看。
使用:
设置好后就可以重启wamp来看看效果:
我们使用 XDEBUG_PROFILE作为url的一个参数写在某个页面上后,转入页面,然后到xdebug.profiler_output_dir所定的路径下,就会发现生成了一个cachegrind.out.开头的文件,这就是webgrind需要分析的文件
进入webgrind主页面:页面很简单,右上角有一排下拉列表
第一项参数参数其实我也纠结了一下,怎么才容易想清楚和说明白:
webgrind把所有被调用函数/方法首先做一个排序,由高到低显示。然后取出前N个,使他们耗时比率之和在90-100%之间。
要注意的是,最好不要选择100%,这样将会显示所有被调用的函数/方法,如果是一个代码复杂的页面,那么webgrind偶尔会被卡死。并且通常我们只要关注耗时前几名的函数即可。
第二个就是选择profile文件。默认是分析最新一次的xdebug记录。如果之前设置好路径和记录机制那么我们就会发现下拉列表里有很多选项。
第三个选项是显示百分比/毫秒/微秒。
下面的彩色进度条一样的东东是耗时量比较条。蓝代表php内置函数,灰色(这里占用很小看不出)代表requir/onclude,绿代表类方法,橙黄代表类其他过程函数 (用户自定义函数)
结果查看
然后下面的分析列表的样子:(选了毫秒作为显示单位)
对于其中一些参数,我在结合我的官网翻译以及*看到的解释是这样的:
Invocation Count
被调用执行的次数
Total Self Cost - 函数自身开销耗时 毫秒/ 微秒 /百分比(并不包含调用其他函数)
Total Inclusive Cost - 综合耗时。包括自身耗时和调用所有的其他函数的耗时
细节分析
我经过试验,才明确了解了几个数据的区别:
测试代码:
<?php得出:
//仅使用内置函数
function t1(){
time();
}
//自定义函数外再执行一次
time();
sleep(1);
t1();
//t2调用自定义函数
function t2(){
t1();
}
t2();
//增加内置函数耗时
function t3(){
sleep(1);
}
t3();
//t4增加调用自定义函数t3一次。
function t4(){
t3();
sleep(1);
}
t4();
//t5增加非调用函数式内耗 for循环10万次,并调用t4
function t5()
{ $u=0;
for($i=0;$i<100000;$i++)
{ $u+=$i; }
t4();
}
t5();
?>
因此我们可以得出最终结论:
- invocation count 表示的是整个php页面从载入到执行完毕呈现,各种函数被调用的总次数(如sleep不管被哪个函数调用,总共页面期执行了6次,t3被t4直接调用、t5间接调用一次,自身执行一次)
- total self cost 表示的是函数自身消耗(就如t5中10万次循环消耗了31毫秒,sleep执行了2000毫秒,但自身消耗并不把其他任何函数调用算在其中)
- total inclusive cost 表示的是此函数从开始到执行完毕所用消耗 ,包括自身消耗和调用其他函数消耗
- Calls - 此函数中调用并执行的所有函数/方法名 次数 及耗时
- Total Call Cost - 被此父函数调用时,执行的总耗时 (the total time executing this function, when called from the parent function)
- Count - 被此父函数调用时,执行的次数。number of times the parent calls the child