栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go JSON解码非常慢。有什么更好的方法呢?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go JSON解码非常慢。有什么更好的方法呢?

解析大型JSON数据似乎确实比应有的慢。查明原因并向Go作者提交补丁是值得的。

同时,如果您可以避免使用JSON并使用二进制格式,则不仅可以避免此问题,还可以避免出现问题。您还将获得时间,使您的代码现在可以将数字的ASCII十进制表示形式解析为它们的等效IEEE
754二进制形式(这样做时可能会引入舍入错误。)

如果您的发送者和接收者都是用Go编写的,我建议使用Go的二进制格式:
gob

做一个快速测试,生成一个包含2000个条目的映射,每个映射包含1050个简单浮点数,这给了我20 MB的JSON,这需要1.16秒才能在我的机器上进行解析。

对于这些快速基准测试,我采取了三种运行方式中的最佳方法,但是我确保只测量实际的分析时间,即

t0 :=time.Now()
在进行Unmarshal调用之前并
time.Now().Sub(t0)
在其之后进行打印。

使用GOB,相同的映射会产生18 MB的数据,解析时间为115毫秒:
十分之一

您的结果会有所不同,具体取决于您那里实际有多少个浮标。如果您的float的有效位数很多,应使用其float64表示形式,那么20
MB的JSON包含的内容将远远少于我的200万个float。在这种情况下,JSON和GOB之间的差异将更加明显。

顺便说一句,这证明问题确实存在于JSON解析器中,而不是要解析的数据量中,也不在于要创建的内存结构中(因为两个测试都解析了约20
MB的数据并重新创建了相同的float片段)。用JSON中的字符串替换所有浮点数后,我的解析时间为1.02秒,这确认了从字符串表示形式到二进制浮点数的转换确实需要花费一定的时间(与仅移动字节相关),但这并不是主要原因。

如果发送者和解析器都不都是Go,或者如果您想进一步降低性能,则应该使用自己的自定义二进制格式,或者使用协议缓冲区,或者手动使用“ encoding /
binary”和其好友。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380349.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号