2011-04-19 65 views
1

我已經開始爲序列化測試protobuf-net。我看過基準測試(http://www.servicestack.net/benchmarks/NorthwindDatabaseRowsSerialization.100000-times.2010-08-17.html),它提示更快的序列化和更小的文件。protobuf-net序列化性能問題

我真的看到一個巨大的產生的文件大小的差異。但是,我看到的速度在WCF的DataContractSerializer的5%以內。

這讓我想知道我是否做錯了什麼?

這裏是我的測試代碼:

private static void ProtoBufSerializer(IQueryable<DataRow> details) 
    { 
     List<DataRow> list = details.ToList(); 

     using (var file = File.Create("protobuf2.bin")) 
     {     
      Serializer.Serialize<List<DataRow>>(file, list); 
     } 
    } 

    private static void DataContractSerializer(IQueryable<DataRow> details) 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataRow>)); 
     List<DataRow> list = details.ToList(); 

     using (FileStream fileStream = new FileStream("testSerializationDataContract.xml", FileMode.Create)) 
     { 
      serializer.WriteObject(fileStream, list); 
     }    
    } 

[ProtoContract] 
public class DataRow 
{ 
    [ProtoMember(1)] 
    public DRFDataRow DrfDataRow; 

    [ProtoMember(2)] 
    public Guid guid; 
} 

[ProtoContract] 
public class DRFDataRow : FixedWidthRow 
{ 
    [ProtoMember(1)] 
    public int CompanyNumber { get; set; } 

    // several fields abreviated for brevety 
} 

[ProtoContract, ProtoInclude(100, "DRFDataRow")] 
public abstract class FixedWidthRow : IProviderRow 
{ 
    // several fields abreviated for brevety 

有我的列表中大約73K的項目。每個項目都不太大,儘管DRFDataRow中有很多字段(大約50)。

P.S .:我沒有抱怨,我對結果非常滿意,因爲序列化的結果尺寸非常小,我只是想知道我是否也能重現我在基準測試中看到的速度增益。

回答

1

在這個例子中,時間開始和結束的時間並不完全清楚 - 例如,如果您包括從IQueryable[<T>]中獲取數據的時間,那麼這很可能是瓶頸。合同看起來不錯;如果你願意,可以有一些小的優化,但沒有什麼重要的(儘管使用基於組的子對象應該通過避免一些緩衝來幫助一點;將DataFormat=DataFormat.Group添加到子對象[ProtoMember(... {here})][ProtoInclude(... {here})])。

如果問題不是IQueryable[<T>],那麼它可能值得嘗試v2(當前可用作alpha或源代碼),它完全檢查內部。

有關更詳細的答案,我需要一個完全可重複的示例進行調查。

+0

你是對的,瓶頸當然是獲取幾乎所有的時間的數據。計時在方法被調用之前開始。我改變了採取已經獲取的列表的方法,只有序列化和結果非常好。用DataContractSerializer序列化2.02秒,用protobuf-net序列化0.83秒。我真的不認爲即使使用實際數據(這是過小的測試數據),我也不需要優化這些結果。 – Gilles 2011-04-19 14:43:41