自從上次轉貼了[轉]優化PHP代碼的42條建議之後,最近又發現了這篇文章,趕快上來亡羊補牢一下,此文章轉貼自:http://www.mrven.com/?p=478,我將會把上一篇文章有錯誤的優化挑出來著名。
----------轉文開始------------
首先我承認我有點標題黨了,然後:
近日Google在Google Code下的“Let's make the web faster”網站中,發表了一篇名為“PHP performance tips ”的文章,介紹了一些php性能優化建議,其中:
- 不要隨意複製變量
- 用單引號表示字符串
- 使用echo輸出字符串
- 不要在echo中使用點號連接符
- 使用switch/case代替if/else
這篇文章發表後沒多久就立刻遭到了一些PHP社區和個人無情的批駁,他們聲稱Google錯了,錯的很徹底,這5條看似有效優化建議其實完全是迷信:
1. 不要隨意複製變量
Zend引擎採用了“寫時復制”機制,這意味著無論你對變量進行多少次復制,真正的複制動作都僅在變量值改變時才發生。
2. 用單引號表示字符串
無數的基準測試已經證明,使用雙引號表示純字符串並不比使用單引號時慢。 有興趣的朋友也可以重複一下這個測試:
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
3. 使用echo輸出字符串
根據php所在服務器環境的不同,某些情況下echo會比print()慢。 這裡有一篇echo和print()對比的帖子,對echo和print()的速度進行了測試:http://www.learnphponline.com/php-basics/php-echo-vs-print
4. 不要在echo中使用點號連接符
基準測試證明這又是一條與事實完全相反的建議。 php引擎處理以點號連接(或者使用雙引號)傳遞給echo的變量實際上是更快的。 你可以重複這個測試:
$ php -d implicit_flush=off -r '$s=microtime(true); for($i=0;$i<100000;$i++) echo “omgwtf”,”bbq”,”\n”; echo microtime( 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”; echo microtime( true)-$s;' | tail -n 1
0.44555306434631
5. 使用switch/case代替if/else
這條建議毫無意義。 關於是要使用switch/case還是if/else的問題,其實完全是個代碼風格問題,而它們的效率相差無幾。
一向以技術為長的Google,竟然在技術問題上犯瞭如此錯誤,相當不嚴謹。 PHP小組已經督促文章作者重新仔細審查文章,希望能盡快改掉,以正視聽。