我已經開始爲序列化測試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