BKJIA快譯】Google小組上周共享了其網站加速的技巧大全,其中包括了一些PHP性能技巧。然而這些PHP性能技巧在PHP社區中引起了一陣軒然大波,PHP小組立刻寫了一篇公開信給這些性能技巧“抓蟲”。有關Google的建議,BKJIA這幾日做了整理,做出文章《加速,加速,再加速:來自Google的網站加速技巧大全》。其中第四頁的後半部分就是專門講PHP相關的性能技巧,在閱讀本文之前可以先熟悉一下。
以下是來自PHP小組的信件譯文:
PHP小組:這篇文章中所給的建議全部都是錯誤的。
1. 沒有原因盡量不要復制變量
PHP 4和5核心的Zend引擎使用了一個名為“copy-on-write”的內存管理系統。也就是說,無論你將一個變量的值賦值給另一個變量多少次,只要你不改變數值,數據是不會被復制的。范例:
- $data = str_repeat("*", 512 * 1024); // synthesize 512K of data
- $memory_used_before = memory_get_usage();
- $more_data = $data;
- $memory_used_after = memory_get_usage();
- print "Before: {$memory_used_before}\nAfter: {$memory_used_after}\n";
有thread-safety及調試功能的PHP 5.3下:
之前:853968
之後:854236
沒有thread-safety及調試功能的PHP 5.2下:
之前:581912
之後:581976
也就是,調試模式下有268字節的差別,正常模式下普遍使用的)有64字節的差別。這和Google文中所述BKJIA編者注:Google原文的描述中,復制變量會“導致雙倍的內存消耗”)相差甚遠。
需要注意的是,PHP代碼中堅決禁止在沒有恰當過濾的情況下將用戶提供的變量原本內容進行echo或者存儲。
2. 為長字符串使用單引號
針對PHP 5.2及5.3的基准測試顯示,雖然雙引號使用竄改interpolation)而單引號使用連鎖concatenation),這兩個的速度是完全一致的甚至雙引號常常會更快一些)。當使用沒有包含變量的普通字符串時,使用雙引號的性能要明顯占優。
3. 使用echo而非print
這兩個方法的運行速度取決於你的PHP是如何設置在host上的。
4. 不要與echo一起使用concatenation連鎖)
事實正好相反。新的引擎處理多條echo的方法,導致在echo中使用concatenation實際上會比較快。
5. 使用switch/case替代if/else
最後,這句建議是徹底的胡說八道。決定在哪裡使用switch/case或者if/else完全取決於編碼習慣,他們的運行速度基本一致,除了在某些特定的情況下。
事實上,在更古老的PHP版本下PHP 3及很老的PHP 4版本)這些大部分建議是正確的,然而在新一代的PHP下,這些絕對是錯誤的。