2012-05-23 25 views
1

在下面的示例中: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); 
+0

您可以使用我博客文章中的代碼自行測試 - http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack -文本/ – Maxim

回答

1

還是會protobuf網處理Class1中爲已序列化的數據的字節[]?

byte[]作爲原始數據處理(和被寫入到該流沒有任何額外的加工),但仍有序列化Class1需要一些次要的事情 - 寫頭字段,和一般的開銷。在處理單個物體時,兩種方法都足夠快速,以至於任何區別都沒有意義。在高容量,不過,我有充分的理由懷疑序列化Class2將明顯快 - 與一個單一的序列化流水線處理避免了一些開銷

將Class1的系列化需要將近兩倍長的Class2序列化?

這將是一個很好的概況,但它取決於你的典型數據。只有你可以拿出實際的數字。我希望「略長」。在這兩個比較中,我比較了「序列化class3的成本,然後序列化一個由該輸出組成的class1」vs「對由class1實例組成的class3進行序列化的代價」

實際上,如果速度是您的首要關注,我希望的最佳的方法是:

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

這種微妙的調整意味着,它可以在非緩衝,轉發-唯一方式寫Class3(通過使用一個終止子,而不是一個長度前綴)。這不是默認的唯一原因是google明確偏好長度前綴方法。