看到一个很有用的东东,收藏。。
http://blog.csdn.net/yukon12345/article/details/11408617
~~~~~~~~~~
使用:
设置好后就可以重启wamp来看看效果:
我们使用XDEBUG_PROFILE作为url的一个参数写在某个页面上后,转入页面,然后到xdebug.profiler_output_dir所定的路径下,就会发现生成了一个cachegrind.out.开头的文件,这就是webgrind需要分析的文件
进入webgrind主页面:页面很简单,右上角有一排下拉列表
第一项参数参数其实我也纠结了一下,怎么才容易想清楚和说明白:
webgrind把所有被调用函数/方法首先做一个排序,由高到低显示。然后取出前N个,使他们耗时比率之和在90-100%之间。
要注意的是,最好不要选择100%,这样将会显示所有被调用的函数/方法,如果是一个代码复杂的页面,那么webgrind偶尔会被卡死。并且通常我们只要关注耗时前几名的函数即可。
第二个就是选择profile文件。默认是分析最新一次的xdebug记录。如果之前设置好路径和记录机制那么我们就会发现下拉列表里有很多选项。
第三个选项是显示百分比/毫秒/微秒。
下面的彩色进度条一样的东东是耗时量比较条。蓝代表php内置函数,灰色(这里占用很小看不出)代表requir/onclude,绿代表类方法,橙黄代表类其他过程函数 (用户自定义函数)
结果查看
然后下面的分析列表的样子:(选了毫秒作为显示单位)
对于其中一些参数,我在结合我的官网翻译以及stackoverflow看到的解释是这样的:
Invocation Count
被调用执行的次数
Total Self Cost - 函数自身开销耗时 毫秒/ 微秒 /百分比(并不包含调用其他函数)
Total Inclusive Cost - 综合耗时。包括自身耗时和调用所有的其他函数的耗时
细节分析
我经过试验,才明确了解了几个数据的区别:
测试代码:
[php] view plaincopyprint?
- <?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