2007年06月22日

PHP 為什麼快?

今天看到鳥毅老大提了一個問題:PHP 為什麼快呢?本來想回應在他的 Blog 上,不過寫一寫又太長了,就貼在自己家吧。

這個問題我想有一部份原因是因為大多數 PHP 函式是直接包裝 C 函式的關係吧?不然光只有 PHP Script 的話 (看看現在的框架應該可以略知一二) ,速度其實也就還好。所以很多時候會聽到一些 PHP 高手告誡我們:如果有現成的 PHP 函式能用的話就用,千萬不要自己寫一個。

另外 PHP 簡單我想也真的是一個重點,鳥毅老大是這麼說的:

Java Servlet或是ASP.Net的overhead都太重,因此對於簡單的需求時會像背著厚重殼的烏龜,PHP就像輕穎的兔子;這也是約耳喜歡ASP的原因吧?若只要寫個九九乘法表還需要寫一堆class、呼叫笨重的VM,實在不是聰明的做法。因此只需要在shell下執行的小程式,我也試著用不熟悉的駱駝文寫些簡單的script;只有在需要連結資料庫或做大量運算時才用Java。雖然qing老大強調OO帶來的overhead已經很小,可是我還是覺得有個肥VM的東西就是很慢呀... eg. Java v.s. VB6

例如一個 echo 指令,從解譯到把結果交給 Web Server ,其過程所要處理的東西遠比 ASP.NET 或是 Java Solution 來的少 (它們都需要類別或物件來處理) 。就算是已經編譯好的 opcode ,也是得透過 VM 來執行。而 PHP 有時候就直接利用 C 函式產生結果,然後丟給 Web Server 或 CLI 等 console ;因此少了一層包裝,其效能就好很多。

換句話說: PHP 作弊

PHP 原本就是靠 Web Server Script 起家的,能儘量利用現有的東西來組合是它的特色也是優點。而現在 PHP5 及未來的版本為了兼顧維護與效能,就漸漸地靠攏 Java ,將物件導向特性包含進來;但是這只是讓 PHP5 語法在表面上看起來像是物件導向語言,但它骨子裡仍然不是。

註:昨天也和 Mark 討論到 (他希望我不要再叫他老大 XD ) , 我們還是希望 PHP 不要完全變成 Java (|||orz 被騙得很慘),而是要像 JavaScript (ECMAScript) ,這樣能結合靜態語言及動態語言的長處 (也許有人抱持和我不一樣的看法,歡迎指教) 。

而提到了維護,傳統 PHP 寫法難以維護也是真的。因為沒有像 RoR 這種統一的架構,變成每個 PHPer 有自己一套開發風格;就算一律採用 SmartyADOdb 或其他類別庫來開發,每個 PHPer 在架構上的規劃還是大相逕庭。而且雖然現在 PHP 也有框架了,不過在選擇上也是令人眼花撩亂,更別提每個框架的開發者都認為自己的框架才是經過千錘百煉的。

註:大概很少有人會拿我書裡面的 Smarty 架構做專案吧?我個人強烈建議各位要自己修改,不要照抄 XD 。

PHP 有它的優點,當然也有缺點;我想任何語言也是一樣的。其實我也不喜歡爭論孰優孰劣,只要這套語言仍是我所熟稔且能應用自如的話,那麼它就是我目前最佳的選擇了。

以上是我個人的看法與經驗,不一定正確,希望各位先進能不吝指教。



Posted by jaceju at 樂多Roodo! │11:31 │回應(1) PHP
樂多分類:網路/3C 共同主題:PHP 程式設計 工具:編輯本文
Ads by Roodo! 
回應文章
只看語言,不看 class lib 與 JVM 。那麼 Java 是個蹩腳的 OOPL。我不知道為什麼現在的人認為 Java 是 OOPL 代表。在我學習 OOP 的時代,最有代表性的 OOPL 是 Smalltalk (現在仍然是), C++ 正努力進行標準化。跟這兩種語言比起來, Java 純粹是妥協後的產物。

Java 的個體世界觀也很蹩腳。例如我現在偶爾要寫 Java 程式時,都常常忘記 main 方法是 static 的。為什麼呢?因為在我看來,執行 Java 程式時,是向 JVM 配置一個 object 並調用 main method。實際在運作的是 JVM 配置的 instance ,那麼 main method 應該是 instance method 而不是 class method/static method 才對。

不過, OO 並不是效能的瓶頸。從組合語言的層次來看,OOPL和非OOPL的差別只在由誰負責維護符號表。前者由編譯器/解譯器負責,後者由程序員自己負責。比較由程序員負責維護符號表的龐大編程時間,交由編譯器負責所犧牲的效能其實非常值得 (這句話在電腦只有16MB記憶體的時代就成立)。

Oh, 扯遠了。 PHP 之所以快,確實跟它骨子裡包的是 C 語言函數有關。Python, Ruby 也是。在某種程度上,這造成了C++的衰退。因為用C語言寫函數庫給 PHP/Python/Ruby使用,還比寫一個C++函數庫簡單。

Java,ASP.NET,它們的基本問題就在於 VM 和 class lib 。這已經帶來了高固定成本。當它們用於 Web application 開發時,又再疊床架屋般的掛了一堆東西。

我覺得 PHP 不需要學 Java ,那是種退步。而 PHP 已經很像 C/C++ 了,而且不需要像 C/C++ 處理型態。那麼 PHP 未來的方向,應該要多像 JavaScript 或 Ruby 借鏡。
Posted by 遊手好閒的石頭成 at 2007年06月22日 17:24