数据格式的重要性-第4部分-基准

基于我以前的文章,我们已经编写了这种可传输格式的实现。 在确定它是正确的之后,是时候用真实世界的数据来测试它,看看我们得出了什么结论。

我们得到了一大堆相对较大的真实数据集,并通过与JSON的比较来运行它们。Net vs 。 可传送的格式。 请注意,对于 阅读 JSON,我们仍然使用JSON。Net,但是我们生成自己的格式,而不是生成一个JObject实例。

下面是在一组JSON文件上运行的结果。

数据格式的重要性-第4部分-基准

正如你所看到的,根据这些数字,似乎没有任何主要的好处。 在这些文件的多次运行中,数字大致相同,两者相差几毫秒。 所以这是一个清洗,对不对?

除了……那不完全正确。 让我们看看这个问题的其他方面。 持久的大小怎么样?

数据格式的重要性-第4部分-基准

在这里,我们看到了一个主要区别。 Blit格式在大多数情况下显示出相当大的空间缩减。 事实上,在某些情况下,这是原始JSON大小的50%-60%。 记住,这是在 千字节.

换句话说,订单文件被切成两半,也就是10KB,我们不必写入磁盘或从磁盘读取。 如果我们需要读取最后50个订单,那就是0。5 MB,不需要去任何地方,因为它根本不存在。 那博客呢? 那一个减少了将近一半,而我们看到的是几乎200千字节没有。 当我们开始考虑所有这些节省下来的输入/输出时,上面的计算成本超出了它们的合理范围。

大量的空间节省是通过压缩长值来完成的,但是其中很大一部分是因为不必重复属性名(特别是注释文档中节省的大部分空间来自于此)。

然而,有很多情况恰恰相反。 日志。json是一个空文档,在JSON中只能用2个字节表示,在Blit格式中需要11个字节。 对我们来说,这不是一个有趣的案例。 另一个子问题是属性文档。 在从JSON转换成Blit格式后,这个文档实际上增长了大约7%。

原因是它的内部结构。 这是一个包含大约2,00个属性和短字符串值的平面列表。 事实上,它是一个单一的大对象,这意味着我们必须使用32位偏移量,这意味着大约8Kb实际上是由偏移量取的。 但我们认为这是一个病态的、不具代表性的病例。 这种类型的文档通常是针对特定的属性进行访问的,这里我们重点介绍一下,因为我们不需要解析120Kb的文本来获得特定的配置值。

现在,让我们看看以JSON格式写回文档的成本。 记住Blit格式(有人请给我找一个好的替代名称,我真的厌倦了)是内部的。 在外部,我们使用并输出JSON字符串。

数据格式的重要性-第4部分-基准

嗯,这里有一个真正的问题,因为我们正在处理小文件,时间太短,无法真正判断。

所以,让我们看看更大的文件会发生什么……我选择了2MB到70MB范围内的文件。 结果如下:

数据格式的重要性-第4部分-基准

有一个例外,那就是安然的数据集。 该数据集由相对大量的大型字段组成(实际上是电子邮件)。 因为Blit格式也压缩大字段,所以我们在解析和构建Blit格式上花费的时间比解析JSON时多。 然而,即使在这种情况下,我们也只能看到17%的增长。

请记住,JSON和Blit格式实际上都是使用同一个JsonTextReader读取数据,唯一的区别是它们对此做了什么。 JSON创建了一个JObject实例,它代表了读取的整个文档。

Blit将创建同样的东西,但它实际上会在非托管内存中生成它。 结果证明这对性能有相当大的影响。 我们不进行任何托管分配,因此垃圾收集器在这个过程中不需要做任何大量的工作。 事实也证明,对于大型文档来说,在如此多的字典中插入如此多的条目的成本绝对不是微不足道的。 相比之下,以Blit格式存储数据需要写入数据和增加指针,以及一些簿记数据。

事实证明,这有一些主要的影响。 但是,这只是问题的一面,看看最终的尺寸怎么样?

数据格式的重要性-第4部分-基准

这里我们非常明数据库同步 确——当你达到实际大小(通常从几十千字节开始)时,你开始看到最终文档大小的一些很大的不同。 现在,再次以JSON身份编写这些文档的成本是:

数据格式的重要性-第4部分-基准

在这里,我们也快多了。 这是因为几个原因。 概要分析向我们展示了在确保我们写的值被正确转义上花费了相当多的时间。 使用Blit格式,我们的源数据已经是一个有效的JSON,所以我们可以跳过它。 在上图中,我们也没有返回相同的JSON。 更确切地说,我们返回相同的 文档,但是字段的顺序不同(它们是以词法顺序返回的,而不是以定义它们的顺序返回的)。

我们也有一个保持相同的属性顺序的模式,但是这是有代价的。 您可以看到,在某些情况下,写出文档的时间显著增加。

数据格式的重要性-第4部分-基准

到目前为止,我只处理了解析单个文档的成本。 处理多个小文档时会发生什么? 以前的大数据集实际上是由许多小文档组成的一个大文档。 例如,公司。json包含超过18,000个小文档,zips有25,000个,等等。 以下是性能结果:

数据格式的重要性-第4部分-基准

正如你在这里看到的,我们做得更好。

这是因为Blit代码实际上足够聪明,能够从传入的流中提取文档的结构,并且能够使用它来进行一系列优化。

总的来说,我对事情的结果很满意。 下一个挑战,把这个插入到RavenDB的核心…