现在的位置: 首页 > 综合 > 正文

一个小玩意PHP-Valgrind的介绍

2014年03月06日 ⁄ 综合 ⁄ 共 1691字 ⁄ 字号 评论关闭

转载:http://www.laruence.com/2013/08/14/2899.html

言归正传, 今天分享个前天刚刚做的小工具, 代码可以在我的github上找到: php-valgrind. 这个工具主要是为PHP脚本提供了可以在脚本中开启Valgrind(严格说是Callgrind)的Profile能力.

一般来说, 我们用Callgrind的时候, 如果要分析某一个函数, 可以通过toggle-collect=”函数名”, 来告诉Callgrind在进入这个函数的时候开始Profile. 但是这样没有办法分析具体某一段代码..

其实Callgrind提供了一个机制, 可以让我们在代码中控制何时开启: CALLGRIND_TOGGLE_COLLECT

比如:

  1. #include <stdio.h>
  2. #include <valgrind/callgrind.h>
  3.  
  4. void foo(int a[100]) {
  5.     int i = 0;
  6. }
  7.  
  8. int main (int argc, char **argv) {
  9.     int i, a[100];
  10.  
  11.     CALLGRIND_START_INSTRUMENTATION;
  12.     CALLGRIND_TOGGLE_COLLECT;
  13.     for (i=0; i<100; i++) {
  14.         a[i] = 2;
  15.     }
  16.     CALLGRIND_TOGGLE_COLLECT;
  17.     CALLGRIND_STOP_INSTRUMENTATION;
  18.     return;
  19. }

然后, 编译成a.out以后, 我们就可以分析具体的这个循环代码断的相关Profile信息:

  1. $ valgrind --tool=callgrind --collect-atstart=no --instr-atstart=no ./a.out

之后生成的callgrind.out就可以被callgrind_annotate, kcachegrind等工具来分析了

  1. $callgrind_annotate callgrind.out.27538
  2. //OUTPUT:
  3. --------------------------------------------------------------------------------
  4.  Ir
  5. ---------------------------------------
  6. 617 PROGRAM TOTALS
  7.  
  8. ---------------------------------------
  9.  Ir file:function
  10. ---------------------------------------
  11. 617 test.c:main [***dev/a.out]

是不是很方便呢?

但是呢, 有的时候, 比如我们做扩展, 或者其他的一类内部的性能分析的时候. 需要在PHP脚本也能做这样的触发. 就没有办法了. 于是我就写了这个小工具php-valgrind, 装好这个扩展以后, 来看个例子:

  1. <?php
  2. $a = array();
  3. callgrind_toggle();
  4. for ($i=0;$i<1000;$i++) {
  5.     $a[$i] = 2;
  6. }
  7. callgrind_toggle();

然后我们开始分析:

  1. $valgrind --tool=callgrind --collect-atstart=no --instr-atstart=no php /tmp/1.php

然后我们分析下输出:

  1. -------------------------
  2.        Ir
  3. --------------------------
  4. 2,361,260 PROGRAM TOTALS
  5.  
  6. //以下省略

然后让我们用qcachegrind(带gui的callgrind分析工具), 来看看:
callgrind.output

可见, PHP要实现同样的功能需要的各种代码数相比C语言来说, 那可是多了N倍的(所以当然要比C慢了.. 嘿嘿, 再次申明: “C语言是最好的语言, 没有之一!”)

好了工具介绍完毕, 大家有兴趣的可以去玩玩, 这个工具还可以用来让我们了解, 我们的一个PHP代码, 会触发调用那些底层的函数, 或者系统调用等等, Enjoy~

抱歉!评论已关闭.