.NET性能优化-是时候换个序列化协议了( 四 )

序列化序列化的Bemchmark的结果如下所示:

.NET性能优化-是时候换个序列化协议了

文章插图
从序列化速度来看MemoryPack遥遥领先,比JSON要快88%,甚至比Protobuf快15% 。
.NET性能优化-是时候换个序列化协议了

文章插图
从序列化占用的内存来看,MemoryPackBrotli是王者,它比JSON占用少98%,甚至比Protobuf占用少25% 。其中ProtoBufDotNet内存占用大主要还是吃了没有byte[]返回方法的亏,只能先创建一个MemoryStream
.NET性能优化-是时候换个序列化协议了

文章插图
序列化结果大小这里我们可以看到MemoryPackBrotli赢麻了,比不压缩的MemoryPackProtobuf有着10多倍的差异 。
.NET性能优化-是时候换个序列化协议了

文章插图
反序列化反序列化的Benchmark结果如下所示,反序列化整体开销是比序列化大的,毕竟需要创建大量的对象:
.NET性能优化-是时候换个序列化协议了

文章插图
从反序列化的速度来看,不出意外MemoryPack还是遥遥领先,比JSON快80%,比Protobuf快14% 。
.NET性能优化-是时候换个序列化协议了

文章插图
从内存占用来看ProtobufDotNet是最小的,这个结果听让人意外的,其余的都表现的差不多:
.NET性能优化-是时候换个序列化协议了

文章插图
总结总的相关数据如下表所示,原始数据可以在文末的Github项目地址获取:
.NET性能优化-是时候换个序列化协议了

文章插图
从图表来看,如果要兼顾序列化后大小和性能的话我们应该要选择MemoryPackBrotli,它序列化以后的结果最小,而且兼顾了性能:
.NET性能优化-是时候换个序列化协议了

文章插图
不过由于MemoryPack目前需要.NET7版本,所以现阶段最稳妥的选择还是使用MessagePack+Lz4压缩算法,它有着不俗的性能表现和突出的序列化大小 。
回到文首的技术选型问题,笔者那个项目最终选用的是Google Protobuf这个序列化协议和框架,因为当时考虑到需要和其它语言交互,然后也需要有较小空间占用,目前看已经占用了111GB的Redis空间占用 。
.NET性能优化-是时候换个序列化协议了

文章插图
如果后续进一步增大,可以换成MessagePack+Lz4方式,应该还能节省95GB的左右空间 。那可都是白花花的银子 。
当然其它协议也是可以进一步通过GzipLz4Brotli算法进行压缩,不过鉴于时间和篇幅关系,没有进一步做测试,有兴趣的同学可以试试 。
附录代码链接: https://github.com/InCerryGit/WhoIsFastest-Serialization
【.NET性能优化-是时候换个序列化协议了】

经验总结扩展阅读