将.NET 7与C语言结合使用通常意味着您想要在.NET环境中调用C语言编写的代码。这可以通过使用C语言的互操作性功能来实现,例如使用PInvoke(平台调用)或C++CLI。以下是一个简单的示例,展示如何使用PInvoke在.NET 7中调用C语言函数:
摘要:## 译者注 本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框
译者注
本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框架的开发人员的学习,一定能让大家获益匪浅。
简介
我发布了一个名为MemoryPack 的新序列化程序,这是一种特定于 C# 的新序列化程序,其执行速度比其他序列化程序快得多。
与MessagePack for C# (一个快速的二进制序列化程序)相比标准对象的序列化库性能快几倍,当数据最优时,性能甚至快 50~100 倍。最好的支持是.NET 7,但现在支持.NET Standard 2.1(.NET 5,6),Unity 甚至 TypeScript。它还支持多态性(Union),完整版本容错,循环引用和最新的现代 I/O API(IBufferWriter,ReadOnlySeqeunce,Pipelines)。
序列化程序的性能基于“数据格式规范”和“每种语言的实现”。例如,虽然二进制格式通常比文本格式(如 JSON)具有优势,但 JSON 序列化程序可能比二进制序列化程序更快(如Utf8Json 所示)。那么最快的序列化程序是什么?当你同时了解规范和实现时,真正最快的序列化程序就诞生了。
多年来,我一直在开发和维护 MessagePack for C#,而 MessagePack for C# 是 .NET 世界中非常成功的序列化程序,拥有超过 4000 颗 GitHub 星。它也已被微软标准产品采用,如 Visual Studio 2022,SignalR MessagePack Hub协议和 Blazor Server 协议(blazorpack)。
在过去的 5 年里,我还处理了近 1000 个问题。自 5 年前以来,我一直在使用 Roslyn 的代码生成器进行 AOT 支持,并对其进行了演示,尤其是在 Unity、AOT 环境 (IL2CPP) 以及许多使用它的 Unity 手机游戏中。
除了 MessagePack for C# 之外,我还创建了ZeroFormatter(自己的格式)和Utf8Json(JSON)等序列化程序,它们获得了许多 GitHub Star,所以我对不同格式的性能特征有深刻的理解。此外,我还参与了 RPC 框架MagicOnion,内存数据库MasterMemory,PubSub 客户端AlterNats以及几个游戏的客户端(Unity)/服务器实现的创建。
MemoryPack 的目标是成为终极的快速,实用和多功能的序列化程序。我想我做到了。
增量源生成器
MemoryPack 完全采用 .NET 6 中增强的增量源生成器。在用法方面,它与 C# 版 MessagePack 没有太大区别,只是将目标类型更改为部分类型。
using MemoryPack;
// Source Generator makes serialize/deserialize code
[MemoryPackable]
public partial class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
// usage
var v = new Person { Age = 40, Name = "John" };
var bin = MemoryPackSerializer.Serialize(v);
var val = MemoryPackSerializer.Deserialize<Person>(bin);
源生成器的最大优点是它对 AOT 友好,无需反射即可为每种类型自动生成优化的序列化程序代码,而无需由 IL.Emit 动态生成代码,这是常规做法。这使得使用 Unity 的 IL2CPP 等可以安全地工作。初始启动速度也很快。
源生成器还用作分析器,因此它可以通过在编辑时发出编译错误来检测它是否可安全序列化。
请注意,由于语言/编译器版本原因,Unity 版本使用旧的源生成器而不是增量源生成器。
C# 的二进制规范
MemoryPack 的标语是“零编码”。这不是一个特例,例如,Rust 的主要二进制序列化器bincode 也有类似的规范。FlatBuffers还可以读取和写入类似于内存数据的内容,而无需解析实现。
但是,与 FlatBuffers 和其他产品不同,MemoryPack 是一种通用的序列化程序,不需要特殊类型,并且可以针对 POCO 进行序列化/反序列化。
