msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

14 Aug 13 一个小玩意PHP-Valgrind的介绍

首先, 太久不更新博客了, 容我先啰嗦几句.

我一直以为人总是会挤出时间写博客的, 但现在看来我错了. 博客很久不更新, 倒不是说没有内容可以分享. 而是这一年来确实忙了很多, 本身工作上的事情就很多, 业余时间也被PHP项目上的事情, Zend的事情填满. 再加上一些小感悟也都在微博上牢骚了… 所以….

Anyway, 很感谢各位经常来我博客的朋友, 不过我建议大家如果是提问的话, 不要在留言里, 有的时候会被博客当做SPAM, 有一些小问题, 可以来微博At我 @laruence

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

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

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

比如:

#include <stdio.h>
#include <valgrind/callgrind.h>

void foo(int a[100]) {
    int i = 0;
}

int main (int argc, char **argv) {
    int i, a[100];

    CALLGRIND_START_INSTRUMENTATION;
    CALLGRIND_TOGGLE_COLLECT;
    for (i=0; i<100; i++) {
        a[i] = 2;
    }
    CALLGRIND_TOGGLE_COLLECT;
    CALLGRIND_STOP_INSTRUMENTATION;
    return;
}

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

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

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

$callgrind_annotate callgrind.out.27538
//OUTPUT:
--------------------------------------------------------------------------------
 Ir
---------------------------------------
617  PROGRAM TOTALS

---------------------------------------
 Ir  file:function
---------------------------------------
617  test.c:main [***dev/a.out]

是不是很方便呢?

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

<?php
$a = array();
callgrind_toggle();
for ($i=0;$i<1000;$i++) {
    $a[$i] = 2;
}
callgrind_toggle();

然后我们开始分析:

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

然后我们分析下输出:

-------------------------
       Ir
--------------------------
2,361,260  PROGRAM TOTALS

//以下省略

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

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

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


分享到:



Related Posts:

Tags: , , , ,

15 Responses to “一个小玩意PHP-Valgrind的介绍”

  1. computer repairs, apple mac pro reviews, cell phone repair, computer support,mercadolibre |

    Its 23-inch screen is already written on Apple’s website because “Discontinued. As a result, the smaller sized or thinner the notebook, the lesser the capabilities in view that they are pressured to go out some ports.

    Feel free to visit my web blog: computer repairs, apple mac pro reviews, cell phone repair,
    computer support,mercadolibre

  2. real estate preview |

    Ԝe’re a ցroup օf volunteers and starting a brand new scheme in ߋur community.
    Your web site provided us with uѕеful information to work on.
    You have done a formidable job and ouг whole groսp can
    be thankful to you.

    Ңere iѕ my blog: real estate preview

  3. Winona |

    I was curious if you ever thought of changing the page layout of your website?
    Its very well written; I love what youve got to say.
    But maybe you could a little more in the way of content so people
    could connect with it better. Youve got an awful lot of text for only having one or two pictures.
    Maybe you could space it out better?

  4. goodboy |

    “C语言是最好的语言” ……

  5. wclssdn |

    我也在微博问过大牛好几个问题.. 就是不理我… 汗… 还有. 类似大牛的这个工具可以用xhprof.. 有图片展示方式… 太直观了… 数据表格也更丰富…

  6. eagle |

    需要另行安装Callgrind吗?

  7. eagle |

    需要另行安装Callgrind吗?

  8. 我叫张大熊 |

    微博私信问了你一个问题 可是还没有得到回答 求回答啊

  9. 我叫张大熊 |

    微博私信问了你一个问题 可是还没有得到回答 求回答啊

  10. php230 |

    V5

  11. 风逐蓝天 |

    PHP 是最好的语言~~~

  12. 微历史 |

    保持更新很重要

  13. pakey |

    没有抢到沙发

  14. 夜丶有雪 |

    前排留名、广告位招租 C语言是最好的语言, 没有之一!

  15. 秋风 |

    终于更新了,试试!

Leave a Reply

*