Go 语言官方库给我们一贯的印象是:强大、好用。但是,金无足赤,人无完人,在一些性能要求苛刻的场景例如 json 解析,某些官方库的表现不尽如人意。
本文介绍几个对标官方库的开源库,它们的性能远超前者。当读者在使用这些官方库遇到性能问题时,可以尝试替换优化。
net/http -> fasthttp
地址:https://github.com/valyala/fasthttp
fasthttpnet/http
复用 goroutine,减轻 runtime 调度压力;
对象复用,大量使用 sync.Pool 减轻 GC 压力。
除了复用,还有其他的一些优化手段,例如尽量避免 string 与 []byte 的转换开销等。
这些优化技巧和最佳实践,在其 Github 主页上已经贴心给出:https://github.com/valyala/fasthttp#fasthttp-best-practices,建议阅读学习。
fasthttpnet/httpnet/httpfasthttp
fasthttp
encoding/json -> jsoniter
地址:https://github.com/json-iterator/go
jsoniterencoding/json
encoding/json
Marshal()
# encoding/json
import "encoding/json"
json.Marshal(&data)
# jsoniter
import jsoniter "github.com/json-iterator/go"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Marshal(&data)
Unmarshal()
# encoding/json
import "encoding/json"
json.Unmarshal(input, &data)
# jsoniter
import jsoniter "github.com/json-iterator/go"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Unmarshal(input, &data)
对其优化原理感兴趣的读者可以看这里:http://jsoniter.com/benchmark.html#optimization-used
golang/protobuf -> gogo/protobuf
地址:https://github.com/gogo/protobuf
ProtoBuf 的全称是 Protocol Buffers,它是由 Google 开发和定义的与 XML、JSON 类似的一种协议格式,用于高效存储与读取结构化数据。它基于二进制,因此使用 ProtoBuf 能将数据压缩得更小。
gogo/protobufgolang/protobuf
golang/protobufgolang/protobuf
有很多知名项目都在使用该库,例如 etcd、k8s、docker swarmkit、tidb、nakama 等。
html/template -> valyala/quicktemplate
地址:https://github.com/valyala/quicktemplate
quicktemplate
quicktemplatehtml/templatequicktemplate
quicktemplate
quicktemplatequicktemplateencoding/jsonencoding/xml
总结
net/http
在使用官方库时遇到了问题,我们很容易通过搜索引擎找到解决方案,或者直接向 Go 官方提 issue 。当切换为开源库时,如果遇到了问题,并不一定能及时得到处理。
官方库的 API 几乎可以保证能与 Go 版本的迭代一直兼容,而三方库可能存在潜在的版本兼容问题,这也是切换时需要考虑的问题。
本文列出来的几个开源库,它们的重点都是优化对应官方库的性能问题。我们可以从这些开源库中,学到很多实用的 Go 代码优化技巧。
当然,如果你的项目中因为这些官方库而导致了性能问题,不妨一试。
往期推荐
机器铃砍菜刀
欢迎添加小菜刀微信
加入Golang分享群学习交流!
感谢你的点赞和在看哦~