我最近開始開發加密貨幣交換聚合器。基本上我會向一堆不同的交易所發送請求並比較價格。這必須盡快完成。在這篇文章中,我將展示一些為了顯著提高我的表現而進行的調整。
但請記住,我不是專家(尤其是圍棋專家),我只是分享我個人專案的發現。
這些改進按運行時最大改進的順序排列。
在任何 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 秒。相當紮實的進步!
如果您對我的基準測試程式碼感興趣,可以在此處取得
如果您喜歡這篇文章並想支持我的工作,您可以在這裡捐款。
以上是提高 Golang API 請求效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!