這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
喜歡和不喜歡Go語言的都喜歡拿效能PK說事.
流傳比較廣的是benchmarksgame的PK資料: http://benchmarksgame.alioth.debian.org/u64q/go.php
在 benchmarksgame
測試中, Go語言的效能已經由之前的很爛到現在和C語言持平或2倍差距之內, 當然還有
3個測試效能差距比較大.
具體的原因我就不細說了, 可以參考我另一個文章: Go1.1效能測試報告(和C差距在10%以內) .
當然, 很多Go語言黑是從來不相信Go語言的效能的, 特別是不相信和C差距在10%以內的說法.
不過在這個老外的最新測試結果中, Go的效能又超出了GCC的效能(GCC比clang有一些差距).
最近, 有另一個外國的部落格評測了各種系統級程式設計語言的效能, 而翻譯後標題給出了PK的字樣.
內容摘要有2點: D語言很NB(clang的99%效能)和超爛的Go效能(clang的22%墊底).
這個效能測試結果幾乎是每幾天就一個驚喜, 具體資料請看:
1. Go效能是clang的22% (2012.07.24)
匿名讀者 寫道
“C/C++已經統治系統編程很久,除了ObjectiveC之外語言都無法獲得很高的關注。有人用多種系統級語言編寫了同樣的地圖產生工具來測試他們的效能,包括D(DMD,LDC,GDC)、Go(GCC-Go,6g)、Haskell(GHC)和Rust。相比C/C++,這些語言都原生支援了諸如記憶體回收這些進階特性,也因此無一能達到C/C++的運行速度。這其中表現最差的是原生Go語言編譯器6g,只有Clang22%的速度,而表現最好的是基於LLVM的D語言編譯器LDC,達到了79%。由於原生就使用了LLVM編譯,Rust成為各語言原生編譯器裡最快的一個,但也只達到了45%。從結果來看,D語言一定是首選。由於D語言許多特性都依賴記憶體回收,如果需要關閉記憶體回收而又要保持良好的使用體驗,則推薦Rust。”
Go語言光榮的以22%的成績墊底!
連結: 系統級程式設計語言效能大PK
2. Go效能是clang的51% (2013.07.27)
匿名讀者寫道 “上一篇發的時候,作者最佳化不夠,現在在幾天的修改以後結果完全不一樣了。
C/C++已經統治系統編程很久,除了ObjectiveC之外語言都無法獲得很高的關注。有人用多種系統級語言編寫了同樣的地圖產生工具來測試他們的效能, 包括D(DMD,LDC,GDC)、Go(GCC-Go,6g)、Haskell(GHC)和Rust。相比C/C++,這些語言都原生支援了諸如垃圾回 收這些進階特性,也因此無一能達到C/C++的運行速度。其中表現最好的是基於LLVM的D語言編譯器LDC,與同樣基於LLVM的C編譯器Clang相比,可以達到它96%的速度。其次是基於LLVM的Rust編譯器,達到了89%。因為LLVM編譯的最佳化做的太好,即使GCC都只能達到Clang 72%。另一個令人驚訝的結果是,基於JVM的Scala竟然能達到Clang70%的速度。幾乎相當於GCC。 "
因為前一個新聞剛發不久, 就有回複說原網站資料已經更新. Go語言的效能大約是51%.
這個新聞是是之前的補充, 因為沒墊底也不突出, 也就閉口不提Go語言的效能測試結果了.
國外原網站作者也採用更委婉的說法: Go語言讓人感到驚喜! (不知道51%倒數效能有什麼值得作者驚喜的).
連結: 系統級程式設計語言效能PK
3. 繼續PK, Go語言效能是69%, GCC是72% (2013.07.30)
4. 繼續PK, Go語言效能是75%, GCC是81% (2013.08.??)
這個資料變化國內的網站沒有都更新. 其中, 還有一些細微的變化過程.
還有一些網站的資料還停留在22%的時代, 比如一直在協助碼農儲存密碼的CSDN大網站:
系統級程式設計語言效能大PK D語言成首選.
5. Go語言效能是87%, GCC是81%, 終極PK嗎?(2013.08.06)
Compiler Speed(s) %FastestClang 0.280 100%LDC 0.281 99%FCC** 0.283 99%Rustc 0.303 92%6g 0.323 87%G++* 0.330 85%Scala 0.344 81%GCC 0.347 81%LLVM-GHC 0.428 65%GHC 0.546 51%DMD 0.567 49%GCCGO 0.598 47%
國外的原網站: Benchmarking level generation: Go, Rust, Haskell and D (and now Scala)
結尾
其實, 我很想將這個PK中各個語言的效能變化曲線畫出來, 特別是Go語言怎麼從22%倒數第一
到87%中等偏上的走勢. 我相信其他語言也有類似的變化過程, 但是不會像Go語言變化的這麼
有喜感.
我想導致Go語言巨大變化的原因之一是: 在對Go語言不熟悉的前提下編寫的Go測試代碼超爛,
不完全相同的測試環境. 具體表現有以下幾點:
- 6g預設的int是int64和C預設的int32比較效能
- Go語言系統包的隨機數產生函數針對並發情境, 和C語言的隨機數設計目標不同, 演算法也不同
- C語言代碼全是在棧上分配空間, Go語言代碼不該make的地方很多
- Go語言代碼中很多彆扭的寫法(早期版本)
- D語言測試中直接關閉了下標越界檢測(
-noboundscheck), Go語言是開啟的
- 當然, 這些都是Go粉的理由…
最後我總結的經驗是: 不要把各種PK的結果當真, 要關注它的變化過程, 這個更有意思!