Messagepack小伙伴们知道是什么吗? 它的性能如何?下面小编就来和你详细介绍介绍Messagepack这个家伙吧。
一、Messagepack是什么?
MessagePack(简写msgpack),它是一个高效的二进制序列化格式。它可以让你像JSON格式一样能够在各种语言之间交换数据。但它比JSON更快、更小。小到整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多一字节的大小。
二、Messagepack性能如何?
MessagePack for C#使用许多技术来提高性能。
1)序列化只使用ref byte []和int offset,不使用(Memory)Stream(调用Stream api会有开销)
2)高级API使用内部内存池,分配工作内存不要低于64k
3)不创建中间实用程序实例(XxxWriter / Reader,XxxContext等)
4)所有代码避免装箱,所有平台(包括Unity / IL2CPP)
5)对静态泛型字段生成的格式化程序进行缓存,查找时从缓存查找(不使用字典缓存,因为字典查找需要一定开销)
6)重新调整的动态代码生成
7)当代码生成知道目标是primitive时直接调用PrimitiveAPI
8)当代码生成知道目标(整数/字符串)范围时,减少可变长度格式的分支
9)不在迭代集合上使用IEnumerable 抽象
10)使用预先生成的查找表来减少检查消息包类型所耗时间
11)对非泛型方法使用优化类型key字典
12)避免找映射(字符串键)键的字符串键解码,并使用自动化名称查找与il内联代码生成
13)对于字符串键编码,预先生成的成员名字节并在IL中使用固定大小的二进制副本
三、反序列化中所有方法性能
性能取决于选项。 这是一个BenchmarkDotNet的微型benchamark。 目标对象有9个成员(MyProperty1〜MyProperty9),值为零。
IntKey,StringKey,Typeless_IntKey,Typeless_StringKey都是MessagePack for C#的方法,在反序列化过程中实现零内存分配。JsonNetString /JilString从字符串反序列化。JsonStStreamReader / JilStreamReader是从StreamReader的UTF8 byte []中反序列化的。反序列化通常从Stream读取。 因此,它将从字节数组(或流)而不是字符串中读取。
MessagePack for C#IntKey是最快的。 StringKey比IntKey慢,因为StringKey需要从字符串进行匹配。 如果是IntKey,读取数组长度,根据数组长度进行for循环二进制解码。 如果StringKey,读取map 长度,根据map长度循环,首先需要对密钥解码,然后按照key查找,最后二进制解码,则需要额外两个步骤(解码密钥和按键查找)。
字符串键通常是有用的,无约束的,简单的JSON替换,与其他语言的互操作性,以及更多的某些版本。 MessagePack for C#也为String Key进行了优化。 首先,它不会将UTF8字节数组解码为与成员名称匹配的字符串,它会按原样查找字节数组(避免解码成本和额外分配)。
它会尝试匹配每个长整型(long)(每8个字符,如果长度不够,填充0)使用automata和在生成时内联IL代码。
以上就是关于messagepack性能的所有内容了,如若你还想了解更多类似这种编程中常见问题及它们的答案,就快来关注我们的网站吧。