Golang標準庫和外部庫的性能比較

前言:

我已經在生產中使用 Go 一段時間瞭,因為它的構建規模較小,並且由 goroutines 提供的並發性能以及直接在機器上運行構建的能力,所以我非常喜歡它的快速和可靠。

由於標準包的速度非常快,您可以在不使用任何第三方庫或框架的情況下構建生產就緒的微服務。這並不是說 Go 中沒有提供更多靈活性或速度的框架,隻是它們不那麼受歡迎。

官方通常告訴你堅持使用標準庫。具有諷刺意味的是, golang 框架 的頂級 Google 搜索結果一般都是關於為什麼不應該使用標準庫。

我對標準庫的替代品進行瞭一些研究和基準測試,以瞭解它們的表現。我將它們分為我認為是關鍵的微服務組件。

所有基準測試都在下面列出的配置上運行。雖然正常的基準測試時間隻有 1 秒,但我將所有測試運行瞭 10 秒,以確保每個測試周期都是一致的。

  • 處理器 — 2.7 GHz Intel Core i7
  • RAM — 16GB — 16 GB 2133 MHz LPDDR3
  • Bench Time 10s 而不是標準的 1s
  • go test -bench=. -benchtime=10s

1、路由

標準的 http Go 服務器帶有一個不錯的路由器,可以讀取查詢參數但不能讀取命名參數,例如,

/students/:studentID/grades/:gradeID


任何具有上述嵌套資源的 REST 服務都必須使用外部路由庫來解析它們。GinEchoBeegoGorilla Mux Goji 隻是其中幾個知名框架(根據 Github 關註量)。

其中一些是具有路由功能的成熟中間件框架,而另一些則僅僅隻是路由庫。

這些庫針對單個命名參數進行瞭測試,結果如下所示,Gin 擁有最快的路由器,Echo 排在第二位。

2、JSON 序列化和反序列化

一旦 API 請求通過路由器並傳遞到控制器或處理程序,下一步就是在返回響應時對請求 JSON Encode 進行解碼。

Go 有一個非常好的encoding包,它支持多種格式,比如json, XML, csv,但是快速瀏覽一下替代品會向你展示大量的庫。我針對標準encoding/json包對 JsoniterEasyJson 進行瞭基準測試,結果如下

下面是編碼的結果,結果表明性能差異並不顯著

但是對於解碼 JSONjsoniter執行速度比標準編碼包快 5 倍。

現在,如果您的請求已被解碼,下一步可能是應用您的業務邏輯,並可能執行一些數據庫操作。

3、是否使用ORM框架

大多數流行的語言都依賴於框架來構建與數據庫交互的微服務。在 Java 世界中,HibernateActive Record for Rails Django ORM 非常流行。ORM(對象關系映射器)有時有助於更好地處理事務、表之間的關系,並有助於避免為簡單連接編寫復雜的 SQL

但是 Go 再次擁有一個非常好的database標準庫,它使連接到關系數據庫變得非常容易,而且速度也非常快。但是,一個痛點是查詢。當您查詢某些行時,您必須手動映射行中的每個字段,然後將它們分配給struct. 這有效,但很快就會變得混亂並讓您編寫大量代碼。sqlx是一個庫,它允許您將整行掃描到您的結構變量中。

雖然sqlx減少瞭為構建 CRUD 而編寫的典型行數,但最終仍會多次編寫重復代碼。使用 ORM 可以幫助減少它並專註於您的業務邏輯。

database, database + sqlx, gorm , go-pg 對查詢進行瞭基準測試,下面是結果。令人驚訝的是,go-pgORM 的執行速度比標準包甚至sqlx還要快. GORM雖然在生態系統中非常有名,但速度相對較慢。

API 調用的每個步驟中,都有更好的框架或外部庫,它們將使您的響應更快並提供一定的靈活性。

4、總結

雖然一些外部庫的性能改進非常明顯,但這不應該成為遠離標準庫的原因。諸如測試代碼的難易程度、開源庫的長期維護、團隊的學習曲線等都應該考慮在內。盡管如此,我認為像 echo + jsoniter + go-pgGo 等標準庫功能的所有令人敬畏的東西將是構建微服務並避免冗餘代碼的最快方法。

到此這篇關於Golang標準庫和外部庫的性能比較的文章就介紹到這瞭,更多相關Golang標準庫和外部庫的性能內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: