2012年11月20日 星期二

Golang: Go 初探


go-lang 實在是很快, 做了一些 Benchmark 後發現 go-lang 使用內建的 http module (包含 router) 的 requests per second 大概可落在 8k 上下,這個數字比 nodejs 直接用 http connection (without router) 的 5.6k 快上許多.. 而 nodejs 搭配 express.js (with router) 自然就比 go-lang http server 遜色。


Google 本身是以 Java 起家,而後加入了許多大量的 Python /C++ 應用,所以 go-lang 本身的設計,可以看出 Google 的野心


首先 data type 及 interface (非 Java 所謂的 Interface) 來取代類別的角色,解決了 Java 的類別繼承的效率問題,還帶來了 dynamic language 的優點,要做 duck typing 很容易;


多執行序方面,內建的 goroutine 解決了concurrency 問題,要做多執行序的程序相當簡易,程序溝通只要寫個箭頭符號即可解決


語法上則參考相當簡易的 Python,好學、開發效率也高


效能方面可接近 JVM 或 C++,編譯的速度更沒話說


套件方面,規格簡單,發佈、安裝也很容易; 要和 C/C++ library 做 binding ,超簡單的 FFI 介面,也可以很快速的跟 C/C++ library 結合。


大膽猜測 Google 想要擺脫 Java 的束縛,使用 Go 來取代 現有的 Java 及 Python code base ,這樣一來,只需使用 Go 就可以在各系統中通用,增進開發效率。




以下是筆者最近做的一個簡單的效能測試

http://c9s.github.com/BenchmarkTest/

以這個 Benchmark 來說 (其實應該分成兩張圖)

各位可以看到 Perl5 + Feersum (Plack HTTP Server 的一個實作) 效能 (Requests per second) 是最高的,該 Benchmark 的 sample code 是做很簡單的事情,開啟一個 HTTP Connection ,然後回傳 Hello World 字串。

同樣的 Node.js HTTP server 的部份也是開啟一個 HTTP Connection 然後回傳 Hello World。

以同樣的 Behavior 來說,可以互相比較的是 Feersum(Perl5) 以及 Node.js HTTP Server。

而 Perl5 + Feersum 的效能相當於 Node.js http server 的三倍。




若實際應用的話,則該參考使用 Route dispatch 下的效能,以 Route dispatch 來說,Express.js (Node.js), Tatsumaki (Perl) 以及 Go HTTP 是可互相比較的,Tatsumaki 的數據還是比 Express.js (Node.js) 高出一倍。

而 Go 內建的 HTTP Server 包含了 Route dispatch,又高出 Perl + Tatsumaki 的數據一倍。



另外筆者參考了其他 Go 相關的 benchmark results,最近這一版的 Go 的效能表現實在是相當優秀,不僅高於 Python ,也與 Java 不相上下。

Go 未來的發展實在指日可待。