找出php性能瓶颈,追踪php代码性能瓶颈

可以看出时间耗掉了4秒,下面用strace跟踪没拿到什么有效信息。

[root@xp trace]# strace -ttt -o log.txt php test.php

[root@xp trace]# more log.txt

imgr?src=http%3A%2F%2Fblog.jiunile.com%2Fwp-content%2Fuploads%2F2013%2F09%2F1.jpg

只看到这两次系统调用之间的延时非常大,却并不知道干了什么?一筹莫展了,幸好,Linux下的调试利器除了strace还有ltrace(当然还有dtrace,ptrace)。

引用:strace用来 跟踪一个进程的系统调用或信号产生的情况,而 ltrace用来 跟踪进程调用库函数的情况(via?IBM developerworks)。

[root@xp trace]# ltrace -c php test.php

imgr?src=http%3A%2F%2Fblog.jiunile.com%2Fwp-content%2Fuploads%2F2013%2F09%2F2.jpg

我们看到库函数strtol的调用非常之频繁,太夸张了,然后我又查了一下这个库函数,简单的说就是把字符串转换成长整形,可以猜测PHP引擎已经检测到这是一个字符串型的数字,所以期望将他们转换成长整型来比较,这个转换过程中消耗了太多时间,我们再次执行:

[root@xp trace]# ltrace -e "strtol" php test.php

(0, 0, 0xec4b00, -1, 0x1f25bc2) = 0x32dd221160

strtol(0x1c9f9d0, 0, 10, 0, 0x7fffe64537f0) = 8

strtol(0x1c9f9b0, 0, 10, 0x7fffe6453880, 0x7fffe64537f0) = 30719

strtol(0x1c9f9d0, 0, 10, 0x32ddb8ee88, 0x32ddb8d580) = -9

strtol(0x1c9f070, 0, 10, 371, 0x10119a0) = 0

strtol(0x1c9ea90, 0, 10, 370, 0x10119a0) = 0

strtol(0x1c9e580, 0, 10, 81, 0x1010c60) = 1

strtol(0x1c9fae0, 0, 10, 82, 0x1010c60) = 0

strtol(0x1ca0cf0, 0, 10, 26, 0x1010c60) = 0

strtol(0x1c9f7a0, 0, 10, 408, 0x1010c60) = 0

strtol(0x1c9e6d0, 0, 10, 432, 0x1010c60) = 0

strtol(0xcea563, 0, 10, 433, 0x1010c60) = 0

strtol(0xcea563, 0, 0, 440, 0x1010c60) = 0

strtol(0x1c9f8f0, 0, 0, 72, 0x1010c60) = -1

strtol(0xcea563, 0, 10, 298, 0x1010c60) = 0

strtol(0x1c9ee50, 0, 10, 5, 0x1010c60) = 1

strtol(0x1c9fb80, 0, 10, 83, 0x1010c60) = 1

strtol(0x1c9fc30, 0, 0, 88, 0x1010c60) = 1024

strtol(0x1c9fce0, 0, 10, 96, 0x1010c60) = 0

strtol(0x1c9fd90, 0, 10, 97, 0x1010c60) = 0

strtol(0x1c9f330, 0, 10, 98, 0x1010c60) = 1

strtol(0x1c9e4d0, 0, 10, 461, 0x1010c60) = 0

strtol(0x1ca05a0, 0, 10, 0, 0x1010c60) = 0

strtol(0x1ca0650, 0, 10, 1, 0x1010c60) = 0

strtol(0x1ca0700, 0, 10, 2, 0x1010c60) = 0

strtol(0x1c9ec70, 0, 0, 8, 0x1010c60) = 0

strtol(0x1ca03c0, 0, 10, 411, 0x1010c60) = 1

strtol(0x1ca0260, 0, 10, 409, 0x1010c60) = 0

strtol(0x1ca0310, 0, 10, 410, 0x1010c60) = 0

strtol(0x1ca0460, 0, 10, 412, 0x1010c60) = 1

strtol(0x1c9f130, 0, 10, 3, 0x1010c60) = 0

strtol(0x1c9f1d0, 0, 10, 24, 0x1010c60) = 0

strtol(0x1c9e9f0, 0, 10, 369, 0x10119a0) = 1

strtol(0x1c9feb0, 0, 10, 25, 0x1010c60) = 0

strtol(0x1c9f3d0, 0, 10, 80, 0x1010c60) = 0

strtol(0x1c9ebd0, 0, 10, 413, 0x1010c60) = 1

strtol(0x1c9efe0, 0, 0, 48, 0x1010c60) = 17

strtol(0x1c9f850, 0, 10, 0, 0) = 0

strtol(0x1ca0d90, 0, 10, 457, 0x1010c60) = 1

strtol(0x1ca0e40, 0, 0, 160, 0x1010c60) = 1000

strtol(0x1ca0500, 0, 0, 432, 0x1010ec0) = 1000

strtol(0xd214c5, 0, 0, 520, 0x1010c60) = 64

strtol(0xd37961, 0, 0, 584, 0x1010c60) = 1000

strtol(0x1ca1250, 0, 10, 560, 0x1010c60) = 1

strtol(0x1c9f990, 0, 0, 0, 0) = 512

strtol(0x1c9eb30, 0, 10, 0, 0) = 14

strtol(0x1ca0f80, 0, 10, 459, 0x1010c60) = 1

strtol(0x1ca1030, 0, 10, 512, 0x1010c60) = 0

strtol(0xcea563, 0, 10, 460, 0x1010c60) = 0

strtol(0xd37a32, 0, 0, 24, 0x100ec20) = 16

strtol(0xd37a49, 0, 0, 32, 0x100ec20) = 120

strtol(0xd37a7c, 0, 0, 544, 0x1010c60) = 300

strtol(0xcea563, 0, 10, 513, 0x1010c60) = 0

strtol(0x1c9ef30, 0, 10, 0, 0) = 30711

strtol(0x1c9f700, 0, 10, 0, 0x1011d80) = 1

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 531783

(0, 0, 0, 15, 0x42622d0) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 531720

(0, 0, 0, 11, 0x7f9fa7b51b80) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 531719

(0, 0, 0, 6, 0x9275f60) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 531897

(0, 0, 0, 9, 0x7f9fa74b8338) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 531901

(0, 0, 0, 3, 0x7f9fa72a8340) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 532944

(0, 0, 0, 3, 0x7f9fa70641d0) = 0x32dd221160

(0x32dd221160, 0, 0, 0x32dd221160, 0) = 525536

(0, 0, 0, 3, 0x7f9fa6e5c680) = 0x32dd221160

.....

知道了症结所在,我们解决的办法就很多了,最简单的就是为in_array加第三个参数为true,即变为严格比较,同时还要比较类型,这样避免了PHP自作聪明的转换类型,跑起来果然快多了。

[root@xp trace]# time php test.php

real0m0.988s

user0m0.959s

sys0m0.024s

imgr?src=http%3A%2F%2Fblog.jiunile.com%2Fwp-content%2Fuploads%2F2013%2F09%2F3.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值