【问题标题】:ProtoBuf-Net PerformanceProtoBuf-Net 性能
【发布时间】:2012-05-23 21:02:11
【问题描述】:

在下面的例子中:

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);

【问题讨论】:

标签: protobuf-net


【解决方案1】:

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

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

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

这将是一个很好的分析,但这将取决于您的典型数据。只有你能想出实际的数字。我希望“稍微长一点”。在这两个方面,我都在比较“序列化 class3 的成本,然后序列化由该输出组成的 class1”与“序列化由 class1 实例组成的 class3 的成本”

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

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

这种微妙的调整意味着它可以以非缓冲、仅转发的方式写入Class3(通过使用终止符而不是长度前缀)。这不是默认设置的唯一原因是 google 明确更喜欢长度前缀方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多