c#最快的序列化机制是什么?这适用于小负载。我期望每100毫秒1,000,000,000。标准的BinaryFormatter非常慢。DataContractSerializer比BinaryFormatter慢。对于小对象,ProtocolBuffers(http://code.google.com/p/protobuf-net/)似乎比BinaryFormatter慢!是否有更多的序列化机制应该关注硬编码或开源项目?编辑:我在内存中序列化,然后通过tcp通过异步套接字传输有效负载。内存中生成的有效载荷是一个带有ulong标识符的小型双精度数组(10到500个点)。您的性能要求将可用的序列化器限制为0。自定义BinaryWriter和BinaryReader将是最快的。我曾预计Protobuf-net即使对于小对象也会更快……但您可能还想尝试我的协议缓冲区端口。我已经有一段时间没有使用Marc的端口了——我上次对它进行基准测试时我的端口更快,但我知道从那以后他经历了彻底的重写:)我怀疑无论你做什么序列化10亿,你都能做到100毫秒内的项目......我认为这只是一个不合理的期望,特别是如果这是写入磁盘。(显然,如果您只是重复覆盖同一内存,您将获得比序列化到磁盘更好的性能,但我怀疑这就是您真正想要做的。)如果您能给我们更多的上下文,我们会更多可以提供帮助。例如,您能否将负载分散到多台机器上?(多核序列化到同一个IO设备不太可能有帮助,因为如果它正在写入磁盘或网络,我不希望这是一个CPU绑定操作。)编辑:假设每个对象是10个双精度数(每个8个字节),带有ulong标识符(4字节)。每个对象至少有84个字节。所以你试图在100毫秒内序列化8.4GB。我真的不认为无论你使用什么,这都是可以实现的。我现在正在运行我的ProtocolBuffers基准测试(它们每秒序列化字节),但我非常怀疑它们是否会给你想要的东西。你声称小项目比BinaryFormatter慢,但每次我测量它时我发现完全相反,例如:WCF绑定使用的序列化性能测试我会得出结论,特别是对于v2代码,这可能是你最快的选择。如果您可以发布您的特定基准测试场景,我很乐意帮助您了解什么是“up”...如果您不能在此处发布,如果您想直接给我发电子邮件也没关系(请参阅个人资料)。我不知道你所说的时间在任何方案下是否可行,但我很确定我可以比你见过的任何时间都快得多。使用v2代码,CompileInPlace提供最快的结果-它允许一些IL技巧,如果编译到物理dll,这些技巧将不起作用。序列化对象的唯一原因是使它们与通用传输媒体兼容。网络、磁盘等串行器的性能永远不会重要,因为传输介质总是比CPU核心的原始性能慢得多。很容易达到两个数量级或更多。这就是为什么属性是可以接受的权衡。它们也是I/O绑定的,它们的初始化数据必须从程序集元数据中读取。这需要先从磁盘读取。因此,如果您要设置性能要求,则需要将99%的注意力集中在传输介质的功能上。100毫秒内的十亿个“有效负载”需要非常强大的硬件。假设有效载荷为16字节,您需要在一秒钟内移动160GB。这甚至超过了机器内部的内存总线带宽。DDRRAM的速度约为每秒5GB。千兆位以太网NIC以每秒125兆字节的速度突发移动。假设没有搜索,商品硬盘驱动器以每秒65兆字节的速度移动。对于当前的硬件功能,您的目标是不现实的。您可以通过在数据结构上实现ISerailizable来编写自定义序列化。不管怎样,你可能会面临一些硬件本身的“阻碍”,无法按照这些要求进行序列化。Proto-Buff非常快,但已经有一个限制。=>http://code.google.com/p/protobuf-net/wiki/Performance根据我的经验,Marc的ProtocolBuffers实现非常好。我没用过乔恩的。但是,您应该尝试使用技术来最小化数据而不是序列化整个数据。我想看下面的。如果消息很小,你应该看看你有多少熵。您可能有可以部分或完全删除重复数据的字段。如果通信是在双方之间进行的,那么您可以从两端构建字典中获益。您使用的TCP有足够的开销并且没有有效负载。您应该通过将邮件分批成更大的包和/或查看UDP来最大限度地减少这种情况。与#1结合进行批处理可能会使您在平均整体通信时更接近您的要求。完整数据宽度加倍还是只是为了方便?如果不使用额外的位,则在转换为二进制流时这是一个优化的机会。当您需要通过单个接口处理多条消息或者您不知道完整的实现细节时,公共序列化很有用。在这种情况下,构建您自己的序列化方法以将单个消息结构直接转换为字节数组可能会更好。现在您知道了双方直接转换的完整实现将不会有问题。它还确保您可以内联代码并尽可能防止装箱/拆箱。这是我所知道的最快的方法。它确实有它的缺点。就像火箭一样,你不会想要它在你的车里,但它有它的位置。就像您需要设置结构并在管道的两端具有相同的结构一样。该结构需要固定大小,或者比这个例子更复杂。这是我机器上的性能(i7920、12gbram)发布模式,没有附加调试器。它在测试期间使用100%cpu,因此测试受CPU限制。在3421毫秒内完成,处理了52.15GB对于15.25GB/s的数据写入速率往返通过..和代码...classProgram{unsafestaticvoidMain(string[]args){intarraySize=100;int迭代次数=10000000;ms[]msa=newms[arraySize];for(inti=0;i//为了对任务池友好,将任务分成1000s{for(intj=0;j如果你不想花时间实现一个全面的显式序列化/反序列化机制,试试这个:http://james.newtonking.com/json/help/html/JsonNetVsDotNetSerializers.htm...当我处理大对象时(序列化到磁盘时超过1GB),我发现NewtonSoft库生成的文件比使用BinaryFormatter时小了4.5倍,处理秒数少了6倍以上是C#学习教程:c#最快的序列化机制是什么?所有内容分享,如果对大家有帮助就有用和需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除.如有转载请注明出处:
