gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:14:07 33 4
gpt4 key购买 nike

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

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

此功能是否存在,或者在这种情况下是否有其他方法可以优化内存使用?

谢谢!

最佳答案

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

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

factory 是:

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

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

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

请注意,在这种用法中,工厂 会将对象重置为原始状态; protobuf-net 不会尝试这样做。另请注意,目前 protobuf-net 并未将其微池公开为可重用组件,但您可以轻松地重用源代码。

此功能是专门为支持吞吐量非常高的用户而添加的,他们希望消除哪怕是最轻微的 GC 开销(基于大量测量......他们向我发送了漂亮的图表和所有内容;p)

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

关于c# - 使用 protobuf-net,是否可以在不分配内存的情况下反序列化消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884346/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com