代码之家  ›  专栏  ›  技术社区  ›  MichaelT

protobuf net如何实现令人尊敬的性能?

  •  34
  • MichaelT  · 技术社区  · 15 年前

    the protocol buffers solution for .NET 开发人 Marc Gravell 速度和现在一样快。

    2 回复  |  直到 7 年前
        1
  •  45
  •   Marc Gravell    15 年前

    protobuf网络使用策略模式;根据需要(仅针对每个类型一次),它使用反射查看类型,并构建一组序列化程序(基于公共接口),用于序列化和反序列化-因此 使用时 它只是逐步遍历已知的序列化程序集。

    在…内 Delegate.CreateDelegate 与酒店交谈,以及 DynamicMethod (和自定义IL)与字段对话(如果可能;这取决于目标框架)。这意味着它总是在和你说话 委托类型,而不仅仅是 DynamicInvoke

    在不发疯的情况下,代码确实在以下方面进行了一些优化(可以说是以牺牲可读性为代价):

    • byte[] 缓冲(输入/输出流)
    • 使用固定大小的数组(而不是列表等);也许太多了
    • 围绕二进制处理循环的大量调整/旋转/etc

    bent it out of shape in a few places ,并积极导致一些重大问题(对于复杂模型) on compact framework

    我有一些设计(仅在我的头脑中)可以使用 ILGenerator (我的第一选择是 Expression ,但这将强制使用更高的框架版本)。然而,问题是这需要相当长的时间才能开始工作,直到最近 I've been pretty swamped .

    start spending some time on protobuf-net again ,所以希望我能清理积压的请求等,并尽快开始。我还打算让它与模型一起工作 其他 而不是反射(即单独描述导线映射)。


    并且不会生成任何生成的代码

    我还应该澄清,如果您想使用生成的代码,有两个(可选)codegen路由;protogen.exe或 VS add-in ,允许从.proto文件生成代码。但事实并非如此 -如果您有一个现有的.proto文件,或者打算与另一种语言(C++等)互操作以进行契约优先开发,那么它主要是有用的。

        2
  •  -3
  •   Maxim    10 年前

    它的性能非常好!

    您可以看到不同格式之间的全面比较,包括我完成的protobuf- http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

    我帖子中的一个测试- enter image description here