我已经开始为序列化测试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 .:我没有抱怨,我对结果非常满意,因为序列化的结果尺寸非常小,我只是想知道我是否也能重现我在基准测试中看到的速度增益。
你是对的,瓶颈当然是获取几乎所有的时间的数据。计时在方法被调用之前开始。我改变了采取已经获取的列表的方法,只有序列化和结果非常好。用DataContractSerializer序列化2.02秒,用protobuf-net序列化0.83秒。我真的不认为即使使用实际数据(这是过小的测试数据),我也不需要优化这些结果。 – Gilles 2011-04-19 14:43:41