今天在知乎上看到了一個關於<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;font-size: 14px;">Go</span>
和<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;font-size: 14px;">Java</span>
效能對比的問題,這種問題通常只有一個結局,那就是無止盡的爭論,十年之後,如果這兩個語言還健在的話,這可能依然是熱門問題:
語言大部分都有它擅長的領域,存在就是合理:
#PHP<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;"></span>
擅長建構低成本WEB,也是世界上最好的語言
#c<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;"></span>
擅長作業系統、嵌入式
Go<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;"></span>
天生高並發屬性
天生高並發屬性<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;"></span>
<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;">Python</span>
在AI領域中獨佔鰲頭
<span style="box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;font-size: 15px;"> Java</span>
工業級應用服務與Android (長期霸佔TIOBE榜第一的老流氓)
<span style="color: rgb(74, 74, 74);box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;">Benchmarks</span>
的測試數據固然能說明一些問題,但這種測試環境和方式還是不夠接地氣呀,很少有遇到類似的Case不說,實際使用中也不會因為幾ms的差距去換語言重構專案。
<span style="color: rgb(74, 74, 74);font-size: 16px;box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;"> 熱點程式碼</span>
,這個概念很重要,有些程式碼片段一個月就命中一次,那就不需要多少極致的優化了。
<span style="color: rgb(74, 74, 74);font-size: 16px;box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;">28</span>
#法則,把80% 的精力花在重要的20% 的程式碼上吧,人的精力有限,世界上還有很多美好的事情,像是寫原創文章分享給大家(手動眨眼)。
<span style="color: rgb(74, 74, 74);font-size: 16px;box-sizing: border-box;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;display: inline-block;padding-right: 2px;padding-left: 2px;line-height: 22px;">Talkischeap.Showme the code.</span>
以我的經驗來看,目前大部分人的程式設計水平,還輪不到談及語言本身的性能,如果你不是,那請加我微信,帶我飛吧。
有個朋友回覆的內容我覺得很客觀,也比較典型,知乎上抓過來的,侵刪。
JAVA目前的問題不在於效能,因為JIT自動優化過的程式碼已經跟C匹敵了。
JAVA的問題是,真正實際專案裡,第三方依賴太多,架構臃腫,過度設計,這時候誰快就不好說了。
我個人認為,因為go基本上只需要標準函式庫就夠了,實際工程中的表現表現要好於JAVA(Go的協程本質也是一種非同步IO模型,Go語言: 萬物皆非同步),除此之外,資源佔用也是效能的一部分,顯然go記憶體佔用更小,CPU消耗相對低。
benchmark game上go在大多數場景下都是跑的比Java快的,而且記憶體消耗是java的1/3;
來列一下Go的不足:
有點反程式設計師的語法
沒有泛型
標準函式庫中資料結構遠不如Java豐富
依賴管理雞肋
- channel如果使用不當,非常容易死鎖
- ##編譯時不允許迴圈import
- 編碼時很多套件名稱會跟自訂的變數名稱衝突
- #Java中許多認為理所當然的函式庫,在Go中發現要重新造輪子
- go get指令會clone整個git倉庫,包括歷史commit
- 標準函式庫不提供routine池
沒有現成的Future機制,要自己透過channel實現
- Java的不足:
暫時就想到這些;當然所有這些都是可以解決的
- 語言表達能力比較欠缺(接地氣的說法叫「又臭又長」)
- 記憶體、CPU消耗大
###堆記憶體較大時,垃圾回收器需要進行深入調優才能得到滿意的回收效果; 然而在一些在對即時性要求高的場景下,gc可能直接就是無解, full gc一觸發就是地獄##################程式需要預熱######
JDK體積龐大, springboot jar套件體積大(在微服務架構下問題最突出)
Spring全家桶越來越重(Spring你做好IoC AOP就夠了),導致使用全家桶的應用,性能較差(可參考TechEmpower Round 14中spring的位置),但也是足夠用的
#因為成熟的框架、函式庫太多,導致很多人入門時被帶偏,以為程式設計就是調API,用框架,而對於原理知之甚少
暫時想到這些; 當然,Java的優點遠遠超過這些不足,否則就不會常年盤踞TIOBE程式語言排行榜第一名了
以上是Go的效能不如Java?的詳細內容。更多資訊請關注PHP中文網其他相關文章!