+ -
当前位置:首页 → 问答吧 → 5个关于php性能的迷信

5个关于php性能的迷信

时间:2009-06-30

来源:互联网

本帖最后由 Ven 于 2009-6-30 12:04 编辑

近日Google 在 Google Code 下的 “Let’s make the web faster” 网站中,发表了一篇名为“PHP performance tips”的文章,介绍了5条php性能优化建议:

  • 不要随意复制变量
  • 用单引号表示字符串
  • 使用echo输出字符串
  • 不要在echo中使用点号连接符
  • 使用switch/case代替if/else

这篇文章发表后没多久就立刻遭到了一些PHP社区和个人无情的批驳,他们声称Google错了,错的很彻底,5条看似有效优化建议其实完全是迷信:

1. 不要随意复制变量
Zend引擎采用了“写时复制”机制,这意味着无论你对变量进行多少次复制,真正的复制动作都仅在变量值改变时才发生。

2. 用单引号表示字符串
无数的基准测试已经证明,使用双引号表示纯字符串并不比使用单引号时慢。有兴趣的朋友也可以重复一下这个测试:[code]php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) “omgwtf$blah\n”; echo microtime(true)-$s;
0.044615983963013
php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) ‘omgwtf’.$blah.”\n”; echo microtime(true)-$s;
0.042807102203369[/code]

3. 使用echo输出字符串
根据php所在服务器环境的不同,某些情况下echo会比print()慢。这里有一篇echo和print()对比的帖子,对echo和print()的速度进行了测试:http://www.learnphponline.com/php-basics/php-echo-vs-print

4. 不要在echo中使用点号连接符
基准测试证明这又是一条与事实完全相反的建议。php引擎处理以点号连接(或者使用双引号)传递给echo的变量实际上是更快的。你可以重复这个测试:[code]$ php -d implicit_flush=off -r ‘$s=microtime(true);for($i=0;$i<100000;$i++) echo “omgwtf”,”bbq”,”\n”; echomicrotime(true)-$s;’ | tail -n 1
1.071463108062710
$ php -d implicit_flush=off -r ‘$s=microtime(true);for($i=0;$i<100000;$i++) echo “omgwtf”.”bbq”.”\n”; echomicrotime(true)-$s;’ | tail -n 1
0.44555306434631[/code]

5. 使用switch/case代替if/else
这条建议毫无意义。关于是要使用switch/case还是if/else的问题,其实完全是个代码风格问题,而它们的效率相差无几。

一向以技术为长的Google,竟然在技术问题上犯了如此错误,相当不严谨。PHP小组已经督促文章作者重新仔细审查文章,希望能尽快改掉,以正视听。
原文链接:http://www.mrven.com/?p=478

作者: Ven   发布时间: 2009-06-30

习惯上比较同意1、2条,但是也不是绝对
后面几条不赞同

作者: peacock   发布时间: 2009-06-30

没什么绝对的,自己习惯就好...

作者: 林轻灵   发布时间: 2009-06-30

反驳例证不充分。

作者: xdevil   发布时间: 2009-06-30

学习

作者: nianjin   发布时间: 2009-06-30

这些建议,也太斤斤计较了。

作者: lobo1314   发布时间: 2009-06-30

想怎么写就怎么写

作者: strongability   发布时间: 2009-07-01

会有问题的。

作者: luzhou   发布时间: 2009-07-01

个人习惯问题吧!!

作者: luckicefire   发布时间: 2009-07-02

拜读并且同意。

作者: 湖人   发布时间: 2009-07-03

* 用单引号表示字符串
    * 不要在echo中使用点号连接符

这两条不是矛盾么?
要在echo中输出变量,用引号不用点号连接怎么输出?

作者: 心痛   发布时间: 2009-07-05

存在即是合理,自己习惯的是最好

作者: lukui306   发布时间: 2009-07-05

感觉在大项目中才用得上吧,一般谁会循环10000次呢?

作者: GoodLuck   发布时间: 2009-07-07

echo $a,$b,' string here ', $g;

作者: 9945   发布时间: 2009-07-07

。。。楼上高,用,替代.

作者: ZeroYao   发布时间: 2009-07-07

单引号那个问题一直很相信~说不用检测是否存在变量,所以快点~~~

不过习惯了就很难改~~

作者: elsonwu   发布时间: 2009-07-10

循环10万次,才差距0。02秒,花来研究的时间的成本,可以升级一个更好的cpu,或者加个内存条了

作者: bobxia   发布时间: 2009-07-13

细节决定成败?

随心所变,想朗个写就怎么写,这就是my style

作者: suncuan   发布时间: 2009-07-16

性能本来就是符合木桶理论的,写出来的代码性能如何,更多的不是因为所谓的某些原生函数的性能问题,而是因为:

1.数据库的设计及SQL
2.算法

所以讨论此类问题根本没有意义

作者: alex   发布时间: 2009-07-20

纯属个人习惯~  还是按标准走吧~  别人看着舒服,你也看着舒服

作者: 如惈   发布时间: 2009-07-20

这个不矛盾,用逗号并不是连接的意思,而是简单的参数传递
连接需要开辟内存,拷贝与读写,意义就复杂一些了

作者: bs   发布时间: 2009-07-20