gzip压缩json与高效二进制序列化的性能

时间:2016-03-07 14:08:58

标签: json optimization serialization gzip cost-management

JSON和Gzip是一种序列化数据的简单方法。它们在编程语言中广泛实现。此表示也可跨系统移植(是吗?)。

我的问题是,与非常有效的二进制序列化方法相比,json + gzip是否足够好(成本低于2倍)?在序列化各种数据时,我正在寻找空间和时间成本。

1 个答案:

答案 0 :(得分:4)

使用json + gzip进行序列化比使用rawbytes + gzip多25%的空间用于数字和对象。对于有限精度数(4位有效数字),序列化大小相同。

来源:https://github.com/csiz/gzip-json-performance

数字

我选择了1e6个浮点(64位)数字。我假设这些数字来自某些自然源,因此我使用指数分布并将它们四舍五入为4位有效数字。因为JSON写下了整个表示,我认为存储大量数据可能会产生更大的成本(123456.000000,而不是0.123456)所以我检查了两种情况。还有一组未被舍入的数字。

压缩的json与二进制的小数字(大约1.0):

json 3.29mb json/raw 43%
binary 3.03mb binary/raw 40%
json/binary 1.09

压缩的json与二进制的大数字(大约1000000):

json 2.58mb json/raw 34%
binary 3.10mb binary/raw 41%
json/binary 0.83

压缩的json vs binary用于完全精度的双精度:

json 8.90mb json/raw 117%
binary 7.27mb binary/raw 95%
json/binary 1.22

物件

对于对象,我在JSON中将它们序列化为通常的懒惰方式:

[
  {
    "small number": 0.1234,
    "large number": 1234000,
    "choice": "two"
  },
  ...
]

对于有效的二进制表示,我对对象进行了矢量化:

n = 1e6
small number = binary([0.1234, ...])
large number = binary([1234000, ...])
choice = binary([2, ...]) # indexes to the enum ["zero", "one", ..., "four"]

压缩的json vs二进制对象:

json 8.36mb json/raw 44%
binary 6.59mb binary/raw 35%
json/binary 1.27