2011-04-19 85 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