從php轉入java開發也有一段時間了,阿里年會歸來,高鐵上旅途漫漫,所以跟同事聊起了java和php的比較。 Q:java有解釋執行和jit,php有opcode,那如果把php的opcode做成編譯式的,或是把java原始碼直接進行解釋執行,那java和php是不是就相同了?
答案:首先java和php的差異不只在這一個方面,php是動態語言,java是靜態語言,php的資料型別是可變的,偵測變數型別一定會有效能上的消耗,會使程式的執行流程加長。如果java直接解釋執行那將享受不到jvm的強大的底層功能,並且如果伺服器系統環境變化了,java原始檔產生的機器碼將可能執行不了。如果php提前編譯成opcode將會使得php喪失即改即生效的特性,得不償失。
java比php好在哪裡:
編輯器對java的支援比php好,例如統一改名,這有利於程式的可維護性;
java的pojo類別可以讓程式的編寫更加方便,更加可控,可以利用編輯器的功能進行一些方便的處理;
php由於是動態語言,所以在運行之前變數的類型是不確定的,運行時需要判斷變數的類型,這就要消耗一定的效能;
php在完成一個請求後會銷毀資源,導致很多資源沒法復用,而java的static屬性是會一直存在於記憶體中的,不會因為請求的結束而銷毀,main方法或者跟服務相始終的方法下的局部變數也不會隨著請求的結束而銷毀,利用這樣的特性spring實現了自動注入,在項目的啟動階段就把必要的物件創建好,雖然記憶體變高了,但是不用像php那樣每來一個請求就重新載入並且初始化所有的資源了。 java這樣就可以很好的實作連線池,而php則很難實作連線池,而且php甚至連單例模式都沒辦法真正實現。這一條可能就是像阿里京東這樣的公司放棄php的關鍵原因吧,高並發環境下java比php應該是高很多個量級,而php更適合中小型的專案;
java的異常機制比php的更加完善,這使得java更加穩定;
php的環境搭建更加複雜,nginx、apache、php都需要進行配置編譯安裝,java的springboot可以直接git下載程式碼就可以啟動項目;
java整個生態系統更加完整,tomcat、kafka、lucene、solr、es,等等各種開源軟體都是java實現的,而php則大部分是依賴c語言實現的開源軟體;
guava的本地緩存可以緩存下本來需要io的數據,減少io佔用,而php緩存基本上依賴於memcache、redis這樣的分散式緩存,依然會有大量的io消耗,即便利用有些擴充可以把資源緩存在本地,但是由於php是多進程的,肯定會比多執行緒的java耗費更多的效能;
php用完就銷毀所有資源的這個特性導致沒辦法維持長連接,現在的swoole框架雖然可以做長連接這一塊,但是性能上還是無法和編譯語言相抗衡。
php為什麼還存在:
java雖然有這麼多好處,但對於中小型專案來說並沒有這麼多的要求,用php可以快速開發完成專案。
相關推薦:
#以上是java和php的分析比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!