我最近开始开发加密货币交换聚合器。基本上我会向一堆不同的交易所发送请求并比较价格。这必须尽快完成。在这篇文章中,我将展示一些为了显着提高我的表现而进行的调整。
但是请记住,我不是专家(尤其是围棋专家),我只是分享我个人项目的发现。
这些改进按运行时最大改进的顺序排列。
在任何 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中文网其他相关文章!