protobuf-net 如何实现可观的性能?

2024-01-04

我想明白为什么.NET 的协议缓冲区解决方案 http://code.google.com/p/protobuf-net/由开发马克·格拉维尔 https://stackoverflow.com/users/23354/marc-gravell就这么快。

我可以理解最初的 Google 解决方案是如何实现其性能的:它预先生成了对象序列化的优化代码;我已经手工编写了一些序列化,并且知道如果避免反射,可以通过这种方式编写相当快的代码。但 Marc 的库是一个运行时解决方案,它使用属性并且不生成任何生成的代码。那么它是怎样工作的 ?


protobuf-net使用策略模式;根据需要(每种类型仅一次),它使用反射来查看类型,并构建一组可用于序列化和反序列化的序列化器(基于通用接口) - 所以使用时它只是单步执行已知的一组序列化器。

Inside它试图在与成员交谈时合理地利用反思;它用Delegate.CreateDelegate与物业交谈,以及DynamicMethod(和自定义 IL)与字段对话(如果可能;这取决于目标框架)。这意味着它总是在与known委托类型,而不仅仅是DynamicInvoke(这非常慢)。

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

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

事后看来,我认为我在泛型问题上犯了一个错误;复杂性意味着强制仿制药进入系统有几个地方变形了 http://marcgravell.blogspot.com/2009/05/generics-and-when-not-to.html,并主动引发一些重大问题(对于复杂模型)在紧凑的框架上 http://marcgravell.blogspot.com/2009/03/compact-framework-woes-revisted.html.

我有一些设计(仅在我的脑海中)来重构它non-通用接口,并且(对于合适的框架)更多地使用ILGenerator(我的第一选择是Expression,但这会强制使用更高的框架版本)。然而,问题是这需要相当长的时间才能开始工作,直到最近我已经被淹没了 http://twitter.com/marcgravell/status/5584270993.

最近我设法再次开始花一些时间在 protobuf-net 上 http://marcgravell.blogspot.com/2009/03/compact-framework-woes-revisted.html,所以希望我能清除积压的请求等,并尽快开始处理。我的目的也是让它与模型一起工作other比反射(即单独描述线路映射)。


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

我还应该澄清,如果您想使用生成的代码,有两个(可选)代码生成路径; protogen.exe,或VS 插件 http://marcgravell.blogspot.com/2009/07/protobuf-net-now-with-added-orcas.html,允许从 .proto 文件生成代码。但这不是needed- 主要如果您有现有的 .proto 文件,或者打算与另一种语言(C++ 等)进行互操作以进行合约优先开发,那么它很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf-net 如何实现可观的性能? 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐