序列化序列化的Bemchmark的结果如下所示:
文章插图
从序列化速度来看
MemoryPack
遥遥领先,比JSON要快88%,甚至比Protobuf快15% 。文章插图
从序列化占用的内存来看,
MemoryPackBrotli
是王者,它比JSON占用少98%,甚至比Protobuf
占用少25% 。其中ProtoBufDotNet
内存占用大主要还是吃了没有byte[]
返回方法的亏,只能先创建一个MemoryStream
。文章插图
序列化结果大小这里我们可以看到
MemoryPackBrotli
赢麻了,比不压缩的MemoryPack
和Protobuf
有着10多倍的差异 。文章插图
反序列化反序列化的Benchmark结果如下所示,反序列化整体开销是比序列化大的,毕竟需要创建大量的对象:
文章插图
从反序列化的速度来看,不出意外
MemoryPack
还是遥遥领先,比JSON快80%,比Protobuf
快14% 。文章插图
从内存占用来看
ProtobufDotNet
是最小的,这个结果听让人意外的,其余的都表现的差不多:文章插图
总结总的相关数据如下表所示,原始数据可以在文末的Github项目地址获取:
文章插图
从图表来看,如果要兼顾序列化后大小和性能的话我们应该要选择
MemoryPackBrotli
,它序列化以后的结果最小,而且兼顾了性能:文章插图
不过由于
MemoryPack
目前需要.NET7版本,所以现阶段最稳妥的选择还是使用MessagePack
+Lz4
压缩算法,它有着不俗的性能表现和突出的序列化大小 。回到文首的技术选型问题,笔者那个项目最终选用的是
Google Protobuf
这个序列化协议和框架,因为当时考虑到需要和其它语言交互,然后也需要有较小空间占用,目前看已经占用了111GB的Redis空间占用 。文章插图
如果后续进一步增大,可以换成
MessagePack
+Lz4
方式,应该还能节省95GB的左右空间 。那可都是白花花的银子 。当然其它协议也是可以进一步通过
Gzip
、Lz4
、Brotli
算法进行压缩,不过鉴于时间和篇幅关系,没有进一步做测试,有兴趣的同学可以试试 。附录代码链接: https://github.com/InCerryGit/WhoIsFastest-Serialization
【.NET性能优化-是时候换个序列化协议了】
经验总结扩展阅读
- 华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践
- 基于 .NET 7 的 QUIC 实现 Echo 服务
- 《ASP.NET Core技术内幕与项目实战》精简集-目录
- 夏普led液晶电视官网报价 夏普led液晶电视性能
- 上 学习ASP.NET Core Blazor编程系列十——路由
- 重新整理 .net core 实践篇 ———— linux上性能排查 [外篇]
- Sql Server性能排查和优化懒人攻略
- 在 .NET 7上使用 WASM 和 WASI
- 重新整理 .net core 实践篇 ———— linux上排查问题实用工具 [外篇]
- .NET 7 中 LINQ 的疯狂性能提升