protobuf-net序列化性能问题

时间:2011-04-19 12:56:54

标签: .net protobuf-net

我已开始测试protobuf-net进行序列化。我见过基准测试(http://www.servicestack.net/benchmarks/NorthwindDatabaseRowsSerialization.100000-times.2010-08-17.html),它建议更快的序列化和更小的文件。

我确实看到了生成文件大小的巨大差异。但是,我看到的速度在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 个答案:

答案 0 :(得分:1)

在该示例中,时间开始和结束的位置并不完全清楚 - 例如,如果您要包括从IQueryable[<T>]获取数据的时间,那么很可能是瓶颈。合同看起来很好;如果您愿意,可以进行一些小的优化,但没有什么重要的(尽管使用基于组的子对象应该通过避免一些缓冲来帮助一点;将DataFormat=DataFormat.Group添加到子对象[ProtoMember(... {here})]和{{ 1}})。

如果问题不是[ProtoInclude(... {here})],那么可能值得尝试v2(目前可用作alpha或源代码),它会彻底检修内部。

要获得更详细的答案,我需要一个完全可重现的例子进行调查。