rkyv比{bincode,capnp,cbor,flodbuffers,明信片,prost,}更快。

2021-03-12 09:06:36

我一直在2020年11月的零拷贝反序列化图书馆工作的rkyv .rkyv类似于Cap' n qualto和flowbuffers,但有一个不同的设计选择,使它脱颖而出:

但只是有设计目标是' t足够好,你需要结果来备份它们。考虑到这一点,我可以' t不足以让我是rkyv的创造者和维护者。然而,我想要的最后一件事就是偏见,所以我做了一些基准,希望能够以自己的优点说服你。

还有一些不同的基准已经提供,但总的来说,他们以几种不同的方式失败:

这导致高度可变的结果,并且可能很难看出一个图书馆是否比另一个库更快

对于大多数序列化格式,您可以执行的所有数据都是序列化和反序列化数据。但零拷贝解除级化库可以在不首先进行反序列化的情况下访问和遍历数据。了解这些操作如何相互比较至关重要,以评估它们的相对性能。

考虑到这些缺点,我掀起了自己的基准。目标是彻底和完整,我想我做得非常好。

您可以自己运行基准测试或从GitHub Repo查看原始数据。我' ll总结了结果。

日志:小型且包含许多字符串的HTTP请求日志的数据集

网格:由三角形组成的单个网格,每个网格都有三个顶点和正常

每个数据集都是从使用PI的前20位接种的RNG随机生成的,因此每个运行都有相同的数据。对于每个数据集,衡量了一个图书馆的:

Abomonation需要一个可变的备份来访问和读取序列化数据。这意味着它'对于某些用例不可行。

虽然FlinBuffers和Cap' N proto支持缓冲缓冲突变在主要(通常是C ++)库中,生锈对应物没有,它们不能为此进行测试。

默认情况下,其他零拷贝解序列化框架都没有提供反级化功能。写作和基准测试我自己的反序列化代码对于这些来说有点毫无意义。您可以了解您' D通过查看读取基准测试,了解了什么样的反序列化性能。

Abomonation' s的解码有资格作为访问不反序列化,因为它产生了不可变的引用而不是可变对象。为了使这个对象进行反序列化,简单的克隆就足够了,但我不是在这里写和基准自己的反序列化代码。

此数据集由HTTP请求日志组成,该日志很小,包含多个字符串。

数据集是单个网格。该网格包含一系列三角形,每个三角形具有三个曲线和正常矢量。

不出所料,这两个性能非常相似,因为它们几乎是相同的格式。 CORE比每个基准中的SERDE_JSON更好,但这两个一贯落后于所有其他框架(在某些情况下,非常大幅度)。

Prost是Protobuf风格序列化的选择代表。其性能在每个基准测试中平均到缺乏风格,除了日志大小基准。它击败明信片,这在尺寸/ Zlib类别中一直非常好。这仅显示了针对Sringy数据进行优化的格式,并最大限度地减少线尺寸。

尽管是完全不同的库,但是Bincode和明信片具有非常相似的基准结果。序列化和反序列化速度非常接近它们,两者之间的主要区别通常是最终尺寸。明信片始终如一地击败Bincode大小和Zlib。我怀疑他们正在使用非常相似的技术,但明信片有几个诡计,袖子' t成本很多,但给它一个相当大的优势。

帽子' n proto有一个很好的表现,它证明了其值作为protobuf的替代品。与PROST相比,序列化更快,并支持相对快速的零拷贝反序列化。这两个功能绝对是杀手。不幸的是,它并没有堆积在另一个零拷贝框架上。与其竞争对手相比,它始终如一的访问和读取时间,并且在网格尺寸基准中失败了很糟糕。这是有道理的,因为它是为了处理大量的原始数据而构建的,但与FlinBuffers相比,看到如此多的浪费空间令人失望。

FlodBuffers是零拷贝反序列化的比较点。它有很多用法,专门用于性能,并证明了零拷贝概念。它在大部分测试中的所有类别都做得很好,但有一个主要的绊脚石。在Minecraft_Savedata测试中,其序列化性能迄今为止,比Serde_JSON(必须编写两倍的数据!)。这突出了FlatBuffers的主要弱点:其在高结构数据上的序列化性能非常差。它可能(甚至可能是可能的),我将这个替补队写得比它更差,但它足够'我应该为通用数据推荐它的用途。

Abomonation绝对是基准中的亮点。它在每个替补席上都证明了其疯狂快速的序列化,并没有遭受其竞争对手陷入的一些大小陷阱。如果它没有带来这么多的警告,那将是一个简单的库。它' s非常不安全,不可移植,需要可变的支持来访问其数据,并不支持突变。尽管如此,Abomonation在每个基准中都是一个非常令人印象深刻的竞争者。

我进入了这些基准,不知道RKYV如何相对于同龄人表现,而是有信心它会发挥良好的表现。它最终比我预期的要好得多。它几乎赢得了几个绩效范畴,并且当它没有胜利时对胜利者具有竞争力。它也这样做也没有妥协,而且它也具有竞争力。最后,它表现出卓越的可扩展性,在其零拷贝竞争对手的所有不同类型的数据上都同样良好的性能,其在一个或多个数据集中的所有难点。与吸引力不同,它也是一种安全,高度便携的格式,不需要变形支持,并且具有比其他竞争对手更多的功能支持。

我欢迎并鼓励任何人为自己运营基准,并打开拉出请求,以改善或清理他们想要的任何东西。我对这些结果的有效性充满信心,并随着更改的变化,乐意将表更新。如果存在任何重大更改,我将更新我的分析。

我的希望是,这篇文章不仅相信你的rkyv是最好的序列化者之一,但它还帮助了您了解Rusti上可用的不同序列化解决方案的关系。

如果您'对rkyv感兴趣,我鼓励您为计划未来的反馈提供贡献