我已开始测试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。:我不抱怨,我对结果非常满意,因为序列化的结果大小要小得多,我只是想知道我是否还可以重现我在基准测试中看到的速度增益。
答案 0 :(得分:1)
在该示例中,时间开始和结束的位置并不完全清楚 - 例如,如果您要包括从IQueryable[<T>]
获取数据的时间,那么很可能是瓶颈。合同看起来很好;如果您愿意,可以进行一些小的优化,但没有什么重要的(尽管使用基于组的子对象应该通过避免一些缓冲来帮助一点;将DataFormat=DataFormat.Group
添加到子对象[ProtoMember(... {here})]
和{{ 1}})。
如果问题不是[ProtoInclude(... {here})]
,那么可能值得尝试v2(目前可用作alpha或源代码),它会彻底检修内部。
要获得更详细的答案,我需要一个完全可重现的例子进行调查。