12月10, 2011

使用xhprof分析PHP的性能瓶颈

最近利用空闲的时间准备对Fl进行重构,Fl是一个支持模版语法(如:Smarty3模版语法)的HTML/Js/Css解析,压缩,美化,检测等工具。关于Fl的更多信息你可以从github上了解。

但是重构完HTML的解析之后,在使用simpletest进行单元测试的时候,使用豆瓣首页的源代码发现比较慢,发现需要1.5s,但在第一个版本中只要200ms就解析完了,这个差距是完全不能接受的。虽然这次重构对很多方法进行了抽象,但应该不至于直接导致这么慢。

之前看过可以使用Facebook开发的xhprof来分析PHP的性能,安装了下分析后终于发现了直接影响到性能的瓶颈。xhprof的安装网上有很多教程,这里就不在说明了。 这里就有个安装的教程: http://hi.baidu.com/thinkinginlamp/blog/item/f4bd08fa1a03ba9e59ee90fd.html

 

从图中可以很分析的看到,find方法里调用的stripos系统函数导致的,这个函数被执行了13749次,花了1s的时间。而find方法主要用于检测特征值所在的位置的,有时候需要不区分大小写进行检测。

更多的信息请见这里

找到问题的所在就要想办法进行优化了,网上找了很久没有发现stripos的替代方案,那只能从使用场景上寻求替代方案了。

使用过程中很多时候是startWith对find方法进行的调用,startWith方法是用来检测是否以某个特征值打头的。

使用substr和首个字符的方式替代原有的find方案,在对一些细节进行了优化后,时间降到550ms了,不过相对于原来的版本还是要差很多。

xhprof不光能够直接观看当前是哪个方法引起的性能外,还是可以看每个函数的执行次数,以及执行的环境,如: 父级方法是什么,调用了哪些其他的方法,非常直观。

有了这些数据后,就可以想办法慢慢的优化了。

当然如果用PHP写一般的应用的话是没有性能问题的。

附上xhprof里的名词解释: http://www.yufeng.me/read.php?282

本文链接:http://welefen.com/post/use-xhprof-analytic-php-performance.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。