我最近开始研究加密货币交换聚合器。基本上我会向一堆不同的交易所发送请求并比较价格。这必须尽快完成。在这篇文章中,我将展示一些为了显着提高我的表现而进行的调整。
但是请记住,我不是专家(尤其是 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