繁体   English   中英

使用protobuf-net,是否可以在不分配内存的情况下反序列化消息?

[英]Using protobuf-net, is it possible to deserialize a message without allocating memory?

我有一个C#应用程序需要每秒反序列化数千个protobuf消息。 为了避免不必要的垃圾收集,我想知道是否有办法使用预先分配的内存,这样每个反序列化操作都不需要分配新的内存。

我设想的是,我会在执行之前分配一个消息对象池,然后指示protobuf代码使用来自此池的下一个可用消息进行每个反序列化。

此功能是否存在,或者在此方案中是否存在其他一些优化内存使用的方法?

谢谢!

就在这里! 在内部,它已经使用微池来避免分配太多的工作缓冲区,但是如果你通过足够的对象来解决GC问题,你可以使用自己的分配方案,并创建一个自定义对象工厂; 这不能在当前属性上指定,但可以通过类型模型应用:

RuntimeTypeModel.Default.Add(typeof (Foo), true).SetFactory(factory);

factory在哪里:

  • Foo上的static方法的名称 (即"CreateFoo" )返回Foo
  • 返回Foo的任何static方法(不需要在Foo )的MethodInfo

在任何一种情况下,该方法都可以使用相同的签名作为回调 - 因此它可以是无参数的,或者可以接受上下文信息。 例如:

public static Foo CreateFoo() {
    return GetFromYourOwnMicroPool();
}

请注意,在此用法中,预计工厂会将对象重置为vanilla状态; protobuf-net不会尝试这样做。 另请注意,目前protobuf-net并未将其微池作为可重用组件公开,但您可以轻松地重新使用该源。

此功能专门用于支持具有极高吞吐量的用户,他们希望删除最轻微的GC开销(基于大量测量......他们向我发送了漂亮的图表和所有内容; p)

另外: 除了root对象之外 ,protobuf-net支持没有装箱的struct值; 因此,如果您有一个复杂/嵌套的对象模型, 在极端情况下的另一个选项是查看struct

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM