ProtoBuf-Net性能

时间:2012-05-23 11:40:25

标签: protobuf-net

在下面的例子中:

Class1序列化几乎是Class2序列化的两倍吗?或者protobuf-net会将Class1中的byte []作为已经序列化的数据处理吗?

伪示例:

[ProtoContract]
class Class1
{
  [ProtoMember(1)]
  public byte[] SerializedData { get; set; }
}

[ProtoContract]
class Class2
{
  [ProtoMember(1)]
  public Class3 NonSerializedData { get; set; }
}

[ProtoContract]
class Class3
{
  [ProtoMember(1)]
  public string Address{ get; set; }

  [ProtoMember(2)]
  public string ZipCode{ get; set; }

  [ProtoMember(2)]
  public string Country{ get; set; }
}

Class3 _c3 = new Class3() { Address = "MyAddress", ZipCode = "90210", Country = "AZ"  }

// Class 1 Serialization
Class1 _c1 = new C1();
_c1.SerializedData = protobuf.Serialize(_c3);

byte[] c1Bytes = protobuf.Serialize(_c1);

// Class 2 Serialization
Class2 _c2 = new Class2();
_c2.NonSerializedData = _c3;

byte[] c2Bytes = protobuf.Serialize(_c2);

1 个答案:

答案 0 :(得分:1)

  

或者protobuf-net会将Class1中的byte []作为已经序列化的数据处理吗?

byte[] 视为原始数据(并在没有任何其他处理的情况下写入流中),但序列化Class1仍然需要一些小的事情 - 写头字段和一般开销。在处理单个对象时,两种方法都足够快,任何差异都没有实际意义。但是,在高容量时,我有充分的理由怀疑序列化Class2会明显加快 - 因为处理单个序列化管道可以避免大量开销

  

Class1序列化的时间几乎是Class2序列化的两倍吗?

这将是一个很好的配置文件,但它将取决于您的典型数据。只有你可以拿出实际的数字。我希望“稍长”。在这两个方面,我都在比较“序列化class3的成本,然后序列化由输出组成的class1”和“序列化由class1实例组成的class3的成本”

实际上,如果速度是您最关心的问题,我希望最佳方法是:

[ProtoContract]
class Class2
{
  [ProtoMember(1, DataFormat = DataFormat.Group)]
  public Class3 NonSerializedData { get; set; }
}

这种微妙的调整意味着它可以以非缓冲的,仅向前的方式编写Class3(通过使用终结符而不是长度前缀)。这不是默认的唯一原因是谷歌显然更喜欢长度前缀方法。