几个秒杀 Go 官方库的第三方开源库

存储 存储软件
Go 语言官方库给我们一贯的印象是:强大、好用。但是,金无足赤,人无完人,在一些性能要求苛刻的场景例如 json 解析,某些官方库的表现不尽如人意。

[[427966]]

本文转载自微信公众号「Golang技术分享」,作者机器铃砍菜刀。转载本文请联系Golang技术分享公众号。

Go 语言官方库给我们一贯的印象是:强大、好用。但是,金无足赤,人无完人,在一些性能要求苛刻的场景例如 json 解析,某些官方库的表现不尽如人意。

本文介绍几个对标官方库的开源库,它们的性能远超前者。当读者在使用这些官方库遇到性能问题时,可以尝试替换优化。

net/http -> fasthttp

地址:https://github.com/valyala/fasthttp

fasthttp号称比net/http快十倍,其优化的核心思路很简单:资源复用。

  • 复用 goroutine,减轻 runtime 调度压力;
  • 对象复用,大量使用 sync.Pool 减轻 GC 压力。

除了复用,还有其他的一些优化手段,例如尽量避免 string 与 []byte 的转换开销等。

这些优化技巧和最佳实践,在其 Github 主页上已经贴心给出:https://github.com/valyala/fasthttp#fasthttp-best-practices,建议阅读学习。

因为fasthttp的实现与标准库差距较大,所以它与net/http的 API 接口是不同的,这导致从net/http重构为fasthttp需要一些学习成本。

使用fasthttp的知名项目:Fiber、Gearbox、atreugo 等。

encoding/json -> jsoniter

地址:https://github.com/json-iterator/go

jsoniter(json-iterator)是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本。官方称 Golang 版本可以比标准库(encoding/json)快 6 倍之多。

最重要的是,它与标准库encoding/json完全兼容。

  • Marshal()
  1. # encoding/json  
  2. import "encoding/json" 
  3. json.Marshal(&data) 
  4.  
  5. # jsoniter 
  6. import jsoniter "github.com/json-iterator/go" 
  7.  
  8. var json = jsoniter.ConfigCompatibleWithStandardLibrary 
  9. json.Marshal(&data) 
  • Unmarshal()
  1. # encoding/json 
  2. import "encoding/json" 
  3. json.Unmarshal(input, &data) 
  4.  
  5. # jsoniter 
  6. import jsoniter "github.com/json-iterator/go" 
  7.  
  8. var json = jsoniter.ConfigCompatibleWithStandardLibrary 
  9. 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/protobuf是基于官方库golang/protobuf的增强版实现:

  • 比golang/protobuf更快地序列化与反序列化;
  • 更规范的 Go 结构;
  • 兼容golang/protobuf;
  • 可选地生成额外的帮助代码,减少代码输入;
  • 可以生成测试代码和 benchmark 代码;
  • 其他序列化格式;

有很多知名项目都在使用该库,例如 etcd、k8s、docker swarmkit、tidb、nakama 等。

html/template -> valyala/quicktemplate

地址:https://github.com/valyala/quicktemplate

quicktemplate启发自 Python 的 Mako 项目,是一个快速、强大且易于使用的 Go 模板渲染引擎,它的主要特性如下:

  • quicktemplate会先将编写的模板代码转换为 Go 语言代码,再进行编译渲染。因此,它比标准库html/template快 20 倍以上。
  • quicktemplate的语法与 Go 语法非常类似,几乎没有学习成本。
  • 几乎所有的 bug 都能在模板编译时被捕获,因此在实际项目中,很少会有受模板相关的bug影响。
  • 模板中可以嵌入任意 Go 代码。

虽然quicktemplate的主要目的是生成 HTML,但它也可用于生成其他数据。

例如,使用quicktemplate可以轻松实现 JSON 和 XML 序列化,并且通过quicktemplate的序列化通常也会比通过标准库encoding/json与encoding/xml更快。

总结

本文列出这几个库并不是让你去立刻替换官方库。例如net/http包,实际上它已经可以满足大多数使用场景。

在使用官方库时遇到了问题,我们很容易通过搜索引擎找到解决方案,或者直接向 Go 官方提 issue 。当切换为开源库时,如果遇到了问题,并不一定能及时得到处理。

官方库的 API 几乎可以保证能与 Go 版本的迭代一直兼容,而三方库可能存在潜在的版本兼容问题,这也是切换时需要考虑的问题。

本文列出来的几个开源库,它们的重点都是优化对应官方库的性能问题。我们可以从这些开源库中,学到很多实用的 Go 代码优化技巧。

当然,如果你的项目中因为这些官方库而导致了性能问题,不妨一试。

 

责任编辑:武晓燕 来源: Golang技术分享
相关推荐

2019-07-30 11:35:54

AndroidRetrofit

2013-01-15 13:50:22

iOS开发开源库

2021-01-27 10:04:46

鸿蒙HarmonyOS动画

2014-07-22 10:56:45

Android Stu第三方类库

2021-06-24 12:57:04

开源安全软件

2011-07-25 14:14:49

iPhone SQLITE Pldatabase

2022-06-06 07:50:55

PythonJSON

2010-03-03 15:10:49

第三方Python库

2013-08-14 09:50:32

iOS类库

2021-03-05 09:58:50

鸿蒙HarmonyOS开源

2015-11-05 16:44:37

第三方登陆android源码

2022-05-21 23:56:16

Python库搜索Python

2021-03-04 08:46:32

鸿蒙HarmonyOS应用

2022-01-14 09:57:14

鸿蒙HarmonyOS应用

2020-10-29 09:56:23

Linux静态库动态库

2012-01-04 14:02:26

JsonCpp

2017-03-14 13:03:18

Android架构第三方库

2022-09-05 09:01:47

第三方库API

2023-03-01 07:21:33

2021-08-03 10:07:41

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号