作者: Laruence( ) 本文地址: http://www.laruence.com/2013/08/14/2899.html 转载请注明出处 首先, 太久不更新博客了, 容我先啰嗦几句. 我一直以为人总是会挤出时间写博客的, 但现在看来我错了. 博客很久不更新, 倒不是说没有内容可以分享. 而是这一年来确
首先, 太久不更新博客了, 容我先啰嗦几句.
我一直以为人总是会挤出时间写博客的, 但现在看来我错了. 博客很久不更新, 倒不是说没有内容可以分享. 而是这一年来确实忙了很多, 本身工作上的事情就很多, 业余时间也被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> 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 <p>然后, 编译成a.out以后, 我们就可以分析具体的这个循环代码断的相关Profile信息:</p> <pre class="brush:php;toolbar:false"> $ 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分析工具), 来看看:
可见, PHP要实现同样的功能需要的各种代码数相比C语言来说, 那可是多了N倍的(所以当然要比C慢了.. 嘿嘿, 再次申明: “C语言是最好的语言, 没有之一!”)
好了工具介绍完毕, 大家有兴趣的可以去玩玩, 这个工具还可以用来让我们了解, 我们的一个PHP代码, 会触发调用那些底层的函数, 或者系统调用等等, Enjoy~