为了账号安全,请及时绑定邮箱和手机立即绑定

golang json/gob/xml 中的序列化性能

golang json/gob/xml 中的序列化性能

Go
牧羊人nacy 2022-01-10 19:10:25
Go 标准库,Json 序列化性能问题...JSON 比 XML 和 GOB 慢,而 json 大小小于 xml 文件大小?请帮忙指出任何错误?docker@dockhost:~/go/projects/wiki$ go run encoding.go 2016/05/24 00:52:16 Serialization by JSON elapsed: 2152195 us2016/05/24 00:52:16 students.json 191777822016/05/24 00:52:17 Serialization by GOB elapsed: 748867 us2016/05/24 00:52:17 students.gob 93051662016/05/24 00:52:18 Serialization by XML elapsed: 1507397 us2016/05/24 00:52:18 students.xml 26177780docker@dockhost:~/go/projects/wiki$ go run encoding.go 2016/05/24 00:52:32 Serialization by JSON elapsed: 1388153 us2016/05/24 00:52:32 students.json 191777822016/05/24 00:52:33 Serialization by GOB elapsed: 502814 us2016/05/24 00:52:33 students.gob 93051662016/05/24 00:52:34 Serialization by XML elapsed: 897859 us2016/05/24 00:52:34 students.xml 26177780docker@dockhost:~/go/projects/wiki$ go run encoding.go 2016/05/24 00:52:41 Serialization by JSON elapsed: 1290359 us2016/05/24 00:52:41 students.json 191777822016/05/24 00:52:42 Serialization by GOB elapsed: 434203 us2016/05/24 00:52:42 students.gob 93051662016/05/24 00:52:42 Serialization by XML elapsed: 862379 us2016/05/24 00:52:42 students.xml 26177780
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

正如您所报告的,您的基准测试有很多运行间的可变性。这使得很难对问题进行推理。我们真正想要的是一个始终给出相同结果的基准,无论我们在一天中的什么时间运行它。


我稍微修改了您的基准测试,以便更容易可靠地再现结果:1. 我将数据序列化到内存(作为字节切片[]byte),2. 我避免数据溢出处理器的缓存(即,使用少量数据)。


有一种在 Go 中编写基准测试的标准方法,以获得更多可重现的结果(https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go),但在这种情况下,我还没有发现有必要。


在https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/golang/serialization查看我的代码


在我的测试服务器(配置用于测试的 Skylake 处理器,运行在平坦的 3.4 GHz,使用 go 1.7)上,我得到...



2016/12/22 09:55:54 Serialization by JSON elapsed: 599 us

2016/12/22 09:55:54 serialized size in bytes:  18781

2016/12/22 09:55:54 Serialization by GOB elapsed: 230 us

2016/12/22 09:55:54 serialized size in bytes:  9066

2016/12/22 09:55:54 Serialization by XML elapsed: 2404 us

2016/12/22 09:55:54 serialized size in bytes:  25780


从我的结果可以看出,JSON 比 XML 略大(30%),而 GOB 小得多。这与你的结果一致。仍然与您的结果一致,GOB 比 XML 和 JSON 快得多。


但是,JSON 序列化比 XML 序列化快得多(快 4 倍)。GOB 的速度是 JSON 的两倍。


你会在自己的硬件上得到不同的结果,但我怀疑你会得到相当一致的数字(运行间变化很小),特别是如果你禁用了 TurboBoost 等 CPU 功能。


如果我们实际上要序列化到磁盘或使用大块数据会发生什么?它不会改变性能排序,因为 GOB 更快更小,JSON 在数据大小和处理大小方面处于中间位置,而 XML 更臃肿且处理速度更慢。


所以我认为我们可以有把握地得出结论,我们有以下...

  1. GOB 更小更快。

  2. JSON 小而快。

  3. XML 又大又慢。


查看完整回答
反对 回复 2022-01-10
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

默认的 json 编码器/解码器执行大量反射。查看https://github.com/pquerna/ffjson以了解生成代码以大大提高性能的替代品。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信