Google的5條錯誤PHP優化建議,與正解

PHP運行於伺服器端,動態生成html網頁。

版主: Cherry

回覆文章
頭像
Weberkk
LV9-見習僧侶
LV9-見習僧侶
文章: 177
註冊時間: 2013-04-03, 00:24
: 傳說中的WB

Google的5條錯誤PHP優化建議,與正解

文章 Weberkk »

首先我承認我有點標題黨了,然後:

近日Google在Google Code下的“Let's make the web faster”網站中,發表了一篇名為“PHP performance tips ”的文章,介紹了一些php性能優化建議,其中:
1.不要隨意複製變量
2.用單引號表示字符串
3.使用echo輸出字符串
4.不要在echo中使用點號連接符
5.使用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-basic ... o-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小組已經督促文章作者重新仔細審查文章,希望能盡快改掉,以正視聽。

====================================

以上全文轉貼自:布鲁文的蓝色奇想
回覆文章