php小玩意源码,一个小玩意PHP-Valgrind的介绍

本文介绍了如何利用Valgrind的Callgrind工具对C程序进行性能分析,并展示了通过PHP扩展php-valgrind在PHP脚本中实现类似功能。作者提供了一个简单的C代码和PHP代码示例,并演示了如何运行Valgrind和callgrind_annotate工具来获取性能报告。此外,还强调了PHP实现与C语言的性能差异,并指出该工具可用于理解PHP代码对底层函数的调用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include 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, 装好这个扩展以后, 来看个例子:

$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

//以下省略

![](/uploads/article/2017/06/24/20170624002105_7486.png)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值