开源!一款功能强大的高性能二进制序列化器Bssom.Net

好久没更新博客了,我开源了一款高性能的二进制序列化器Bssom.Net和新颖的二进制协议Bssom,欢迎大家Star,欢迎参与项目贡献!

Net开源技术交流群 976304396,禁止水,只能讨论技术, 欢迎与我讨论和性能相关的技术话题!
另外,我还在抖音申请了一个账号,用来记录自己的日常生活, 想了解我平常是怎么写代码的吗? 来关注我一下,哈哈! 抖音号: 198152455
Bssom.Net项目地址: https://github.com/1996v/Bssom.Net
Bssom协议地址: https://github.com/1996v/Bssom

A small, high performance, powerful serializer using bssom binary protocol

Bssom.Net是一个使用bssom结构协议实现的高性能结构化二进制序列化器,它具有以下特点,小巧,快速,功能性强.

小巧,文件仅300多k

快速,它具有一流的序列化和反序列化

功能性强:

可以获取对象被序列化后的大小而不用完整序列化对象

可以读取对象中的某个元素而不用完整的反序列化对象

可以更改对象中的某个元素而不用完整的序列化

序列化后的格式具有自描述性

为什么需要?

目前c#已经有很多二进制序列化器, 但这些序列化器都只提供了单一的序列化和反序列化功能.

Bssom.Net采取了Bssom协议, 使序列化后的数据具有结构化特性, 且拥有直接对字段进行编组的功能, 这使得Bssom.Net能做到其它序列化器所达不到的事情.

当我想在序列化对象时知道对象被序列化后的大小, 以提前来选择该对象应该被序列化的正确位置(如数据库引擎的FSM算法), 那么Bssom.Net能够满足你

当我拥有一个大的二进制数据, 但是我只想无合约的读取其中一个字段, 以避免完整的反序列化开销, 那么Bssom.Net能够满足你

当我拥有一个已经被序列化后的数据包, 我只想无合约的修改其中一个字段, 以避免重新序列化的开销, 那么Bssom.Net能够满足你

当我想让对象被序列化后仍能保留类型信息, 而不用依赖实体, 那么Bssom.Net能够满足你

什么是Bssom协议?

Bssom(Binary search algorithm structure model object binary marshalling)是一个使用二分查找算法模型对对象进行结构化编组的协议,被编组后的数据具有特殊的元数据信息,根据这些元数据信息可以高效的仅读取和更改对象中的某个元素,这样可以在对大对象进行序列化和反序列化的过程中不必因为只读取或只写入一个字段而造成完整的序列化开销。

大纲

1.性能

开源!一款功能强大的高性能二进制序列化器Bssom.Net


这里是与.NET平台下非常优秀的两款序列化程序(MessagePack 和 Protobuf-net)进行性能比较的基准.

柱状数据代表执行相同任务所花费的时间, 越低代表性能越快, 折线数据代表执行相同任务所产生的GC, 越低代表在执行中所产生的垃圾越少 , 从性能比较结果可以看出Bssom.Net的性能是非常优异的.

Bssom.Net使用很多技术来提高性能.

使用内存池技术, 用于写入的内存可以复用

使用表达式和Emit动态编程技术, 对类型进行了特殊处理, 且避免值类型装箱拆箱

使用泛型静态缓存, 避免了字典查找开销

包装了异常抛出代码, 以增加内联的可能性

更多的对强类型进行调用, 而不是接口抽象

预处理Map2类型的元数据, 在序列化时不需要对其进行再次编码

在查找Map2键时, 提前固定局部引用, 而不是标准函数调用

解析Map1类型时, 自动构建8字节的自动机跳跃查找

值得一提的是, 出于减少依赖, 减少体积的目的, Bssom.Net并没有依赖System.Memory.dll, 因此无法使用Span<T>,Memory<T>等类型, 这意味着Bssom.Net的实现将无法使用ByReference<T>这一JIT内部特性, 因此目前的读写器将不具备读写局部化和去虚拟化及内联调用的这三个性能优化点 ( 但即使这样, 目前的Bssom.Net性能依然非常优秀 ) , 若将来有可能支持Span<T>类型的话, 那么Bssom.Net将会通过一些额外的性能技巧来再次提升性能.

2.读写器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxfj.html