首頁  >  文章  >  後端開發  >  Go的效能不如Java?

Go的效能不如Java?

Go语言进阶学习
Go语言进阶学习轉載
2023-07-24 14:45:281270瀏覽

今天在知乎上看到了一個關於<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> 效能對比的問題,這種問題通常只有一個結局,那就是無止盡的爭論,十年之後,如果這兩個語言還健在的話,這可能依然是熱門問題:

Go的效能不如Java?

##拋開應用場景談表現都是耍流氓

目前我主要使用的也是Java和Go,方向是大數據,首先我先談談我的看法:

  • 語言大部分都有它擅長的領域,存在就是合理:

    • #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>

      R######### 的科學計算、統計無人能及#######
    • <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的不足:

  1. 有點反程式設計師的語法

  2. 沒有泛型

  3. 標準函式庫中資料結構遠不如Java豐富

  4. 依賴管理雞肋
  5. channel如果使用不當,非常容易死鎖
  6. ##編譯時不允許迴圈import
  7. 編碼時很多套件名稱會跟自訂的變數名稱衝突
  8. #Java中許多認為理所當然的函式庫,在Go中發現要重新造輪子
  9. go get指令會clone整個git倉庫,包括歷史commit
  10. 標準函式庫不提供routine池

沒有現成的Future機制,要自己透過channel實現

  1. 暫時就想到這些;當然所有這些都是可以解決的

  2. Java的不足:
  3. 語言表達能力比較欠缺(接地氣的說法叫「又臭又長」)
  4. 記憶體、CPU消耗大
  5. ###堆記憶體較大時,垃圾回收器需要進行深入調優才能得到滿意的回收效果; 然而在一些在對即時性要求高的場景下,gc可能直接就是無解, full gc一觸發就是地獄##################程式需要預熱######
  6. JDK體積龐大, springboot jar套件體積大(在微服務架構下問題最突出)

  7. Spring全家桶越來越重(Spring你做好IoC AOP就夠了),導致使用全家桶的應用,性能較差(可參考TechEmpower Round 14中spring的位置),但也是足夠用的

  8. #因為成熟的框架、函式庫太多,導致很多人入門時被帶偏,以為程式設計就是調API,用框架,而對於原理知之甚少

暫時想到這些; 當然,Java的優點遠遠超過這些不足,否則就不會常年盤踞TIOBE程式語言排行榜第一名了

以上是Go的效能不如Java?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Go语言进阶学习。如有侵權,請聯絡admin@php.cn刪除