webgrind是一个网页版的性能分析工具,它的主要作用就是分析xdebug生成的cachegrind文件,以一种界面友好详尽的方式来展示性能数据。试用了一下感觉还是很不错的,鉴于网上并没有一个系统介绍,特写一篇文章:

webgrind官方定义翻译版:https://github.com/jokkedk/webgrind

==================================================================================

是性能分析工具xdebug的PHP web版。它实现了 kcachegrind  的部分功能,但安装简便,适用所有平台,性能优化。

另外它是 Google Summer of Code(Google编程之夏)2008的建议计划之一。

特点:

相关的讨论建议版:webgrind google group.
安装:
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,绿代表类方法,橙黄代表类其他过程函数 (用户自定义函数)

结果查看

然后下面的分析列表的样子:(选了毫秒作为显示单位)

对于其中一些参数,我在结合我的官网翻译以及stackoverflow看到的解释是这样的:

Invocation Count
被调用执行的次数

Total Self Cost - 函数自身开销耗时  毫秒/ 微秒 /百分比(并不包含调用其他函数)
Total Inclusive Cost - 综合耗时。包括自身耗时和调用所有的其他函数的耗时

细节分析

我经过试验,才明确了解了几个数据的区别:

测试代码:

  1. <?php
  2. //仅使用内置函数
  3. function t1(){
  4. time();
  5. }
  6. //自定义函数外再执行一次
  7. time();
  8. sleep(1);
  9. t1();
  10. //t2调用自定义函数
  11. function t2(){
  12. t1();
  13. }
  14. t2();
  15. //增加内置函数耗时
  16. function t3(){
  17. sleep(1);
  18. }
  19. t3();
  20. //t4增加调用自定义函数t3一次。
  21. function t4(){
  22. t3();
  23. sleep(1);
  24. }
  25. t4();
  26. //t5增加非调用函数式内耗 for循环10万次,并调用t4
  27. function t5()
  28. { $u=0;
  29. for($i=0;$i<100000;$i++)
  30. {  $u+=$i;   }
  31. t4();
  32. }
  33. t5();
  34. ?>

得出:

因此我们可以得出最终结论:

  1. invocation count 表示的是整个php页面从载入到执行完毕呈现,各种函数被调用的总次数(如sleep不管被哪个函数调用,总共页面期执行了6次,t3被t4直接调用、t5间接调用一次,自身执行一次)
  2. total self cost 表示的是函数自身消耗(就如t5中10万次循环消耗了31毫秒,sleep执行了2000毫秒,但自身消耗并不把其他任何函数调用算在其中)
  3. total inclusive cost 表示的是此函数从开始到执行完毕所用消耗 ,包括自身消耗和调用其他函数消耗

点击一个父函数名后出现展开:

  1. Calls - 此函数中调用并执行的所有函数/方法名 次数 及耗时
  2. Total Call Cost - 被此父函数调用时,执行的总耗时 (the total time executing this function, when called from the parent function)
  3. Count - 被此父函数调用时,执行的次数。number of times the parent calls the child

webgrind安装使用详细说明的更多相关文章

  1. vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章。

    vs2010如何安装mvc3,怎样安装,详细的步骤,从哪下载?请看这篇文章. 安装步骤:vs2010 -> vs2010sp1 -> AspNetMVC3Setup -> AspNe ...

  2. win8.1系统的安装方法详细图解教程

    win8.1系统的安装方法详细图解教程 关于win8.1系统的安装其实很简单 但是有的童鞋还不回 所以今天就抽空做了个详细的图解教程, 安装win8.1系统最好用U盘安装,这样最方便简单 而且系统安装 ...

  3. RHEL 6.3安装(超级详细图解教程)[转载]

        附:RHEL6.3下载地址 32位:http://rhel.ieesee.net/uingei/rhel-server-6.3-i386-dvd.iso 64位:http://rhel.iee ...

  4. 安装WordPress详细教程指南

    最近准备自己建一个个人博客,以便分享一些自己工作生活中的一些观点及经验,建博客当然选wordpress,毕竟wordpress是为博客而生的嘛.下边记录一下自己安装WordPress的详细过程指南,亦 ...

  5. 【Oracle RAC】Linux系统Oracle11gR2 RAC安装配置详细过程V3.1(图文并茂)

    [Oracle RAC]Linux系统Oracle11gR2 RAC安装配置详细过程V3.1(图文并茂) 2 Oracle11gR2 RAC数据库安装准备工作2.1 安装环境介绍2.2 数据库安装软件 ...

  6. 【Oracle RAC】Linux系统Oracle12c RAC安装配置详细记录过程V2.0(图文并茂)

    [Oracle RAC]Linux系统Oracle12c RAC安装配置详细过程V2.0(图文并茂) 2 Oracle12c RAC数据库安装准备工作2.1 安装环境介绍2.2 数据库安装软件下载3 ...

  7. Ubuntu下安装JDK详细教程

    Ubuntu下安装JDK详细教程 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ Ubuntu版本:Ubuntu-12.04.5-desktop-i386 ...

  8. Git学习系列之Windows上安装Git详细步骤(图文详解)

    前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...

  9. mysql编译安装(详细)(转载)

    mysql编译安装(详细)   一.编译安装MySQL前的准备工作 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl 安装cmake,从 ...

随机推荐

  1. F5负载均衡综合实例详解(转)

    转载自:https://blog.csdn.net/weixin_43089453/article/details/87937994  女程序员就不脱发了吗来源于:<网络运维与管理>201 ...

  2. 吴裕雄--天生自然 PHP开发学习:表单验证

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  3. 面向对象 part5

    构造函数模式与原型模式结合 function Person(name) = { this.name = name this.friends = ["a", "b" ...

  4. protobuf使用遇到的坑

    在这里具体的使用我不写了,可以参考下面接个连接,我只记录自己遇到的问题. https://www.cnblogs.com/autyinjing/p/6495103.html(此博客很详细,不过最好不要 ...

  5. Python 学习笔记:根据输入年月区间,返回期间所有的月份

    目的: 给定一个年月区间,比如:2019.01 至 2019.05,要求返回一个包含期间所有的月份的列表,比如:['2019.01', '2019.02', '2019.03', '2019.04', ...

  6. 整理平时常用git命令

    git常用命令 git创建分支 #创建本地分支并切换到新创建的分支 $ git checkout -b newbranch #将新创建的分支信息推送到github $ git push origin ...

  7. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:TensorFlow图像处理函数

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #读取图片 image_raw_data = tf ...

  8. 吴裕雄--天生自然 PYTHON3开发学习:SMTP发送邮件

    import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] ) SMTP.sendmail(from_addr, ...

  9. 学习LCA( 最近公共祖先·二)

    http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...

  10. 通过javascri实现输入框只能输入数字

    输入框只能输入数字 <input type="text" onkeyup="value=value.replace(/[^\d]/g,'');"> ...