我最近開始研究加密貨幣交換聚合器。基本上我會向一堆不同的交易所發送請求並比較價格。這必須盡快完成。在這篇文章中,我將展示一些為了顯著提高我的表現而進行的調整。
但請記住,我不是專家(尤其是 Go 專家),我只是分享我自己個人專案的發現。
這些改進按運行時間最大改進的順序排列。
在任何 Go 程式中,goroutine 對於速度都是至關重要的。我最大的提升是同時發送請求。由於我需要連接 12 個不同的交易所,因此同時發送這些請求將我的運行時間從大約 24 秒減少到大約 3 秒。
Goroutines 非常神奇且非常容易使用。您應該盡可能包含它們。但始終要小心數據爭用
我將encoding/json換成了github.com/json-iterator/go.jsoniter是一個快速JSON處理庫,可以作為標準庫的直接替代品,所以我不必更改任何代碼,只是一個庫開關。
基準結果
為了衡量效能改進,我執行了一些基準測試來比較encoding/json 和 jsoniter。以下是結果摘要:
goos: linux goarch: amd64 pkg: apiSpeedImprove cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkEncodingJSON-12 140383 7381 ns/op BenchmarkJSONIter-12 974605 1217 ns/op PASS ok apiSpeedImprove 3.216s
所以,jsoniter 比標準函式庫快大約 6 倍。
我開始重複使用 HTTP 處理程序,而不是為每個請求建立新的處理程序。透過設定一次處理程序並重複使用它,我減少了為每個請求建立新處理程序的開銷。
基準結果
以下是比較重複使用處理程序與為每個請求建立新處理程序的基準測試結果:
goos: linux goarch: amd64 pkg: apiSpeedImprove/httpReuse cpu: AMD Ryzen 5 7640U w/ Radeon 760M Graphics BenchmarkReusedHandler-12 2179 505189 ns/op BenchmarkNewHandlerPerRequest-12 2341 507525 ns/op PASS ok apiSpeedImprove/httpReuse 7.270s
與為每個請求建立新的處理程序相比,重複使用 HTTP 處理程序可以略微提升效能。
透過這些調整,我成功地將收集所有資訊所需的時間從最初的 24 秒縮短到大約 2 秒。相當紮實的改進!
如果您對我的基準測試程式碼感興趣,可以在這裡找到
如果您喜歡這篇文章並想支持我的工作,您可以在這裡捐款。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3