当前位置: 首页 > 编程语言 > C#

我可以重用对象实例以避免使用protobuf-net进行分配吗?Share

时间:2023-04-10 20:02:25 C#

我可以重用对象实例以避免使用protobuf-net进行分配吗?上下文:这是基于一个被问到然后在我回答之前被删除的问题-但我认为这是一个很好的问题,所以我清理了它,重新发布并重新发布。在使用protobuf-net的高吞吐量场景中,大量分配是一个问题(尤其是对于GC),是否可以重用对象?例如,通过添加Clear()方法?[ProtoContract]publicclassMyDTO{[ProtoMember(1)]publicintFoo{get;放;}[ProtoMember(2)]publicstringBar{get;放;}[ProtoMember(3,DataFormat=DataFormat.Group)]publicListValues{get{返回值;}}privatereadonlyListvalues=newList();publicvoidClear(){values.Clear();富=0;栏=空;protobuf-net永远不会调用你的Clear()方法本身,但对于简单的情况,你可以简单地自己做并使用Merge方法(在v1API上,或者只是将对象传递给v2API中的反序列化)。例如:MyDTOobj=newMyDTO();for(...){obj.Clear();Serializer.Merge(obj,source);这会将数据加载到现有对象中,而不是每次都创建一个新对象。在更复杂的场景中,您希望减少对象分配的数量并且乐于自己处理对象池/重用,那么您可以使用自定义工厂。例如,您可以向MyDTO添加方法,例如://这也可以接受序列化上下文参数,如果//您想要传入池等publicstaticMyDTOCreate(){//尝试从池中获取;只在必要时分配新的对象returnSomePool.GetMyDTO()??新的MyDTO();并且,在应用程序启动时,配置protobuf-net以了解它:RuntimeTypeModel.Default[typeof(MyDTO)].SetFactory("Create");(SetFactory也可以接受MethodInfo-如果工厂方法未在关联类型中声明则很有用)有了这个,应该发生的是使用工厂方法而不是通常的构造机制。但是,当您完成对象清理(Clear())对象并将它们返回到池中时,这完全是您的工作。工厂方法的特殊之处在于它可以用于列表中的新孩子等,这是Merge无法做到的。以上是C#学习教程:CanIreuseobjectinstancestoavoidallocationwithprotobuf-net?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: