如何解决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个)。
附注:我没有抱怨,我对结果感到非常满意,因为序列化结果的大小非常小,我只是想知道我是否还能重现基准测试中看到的速度提升。解决方法
在该示例中,时间的开始和结束位置尚不完全清楚-例如,如果您要包括从ѭ1中获取数据的时间,则很可能会遇到瓶颈。合同看起来还不错。如果您愿意,可以进行一些小的优化,但是没有什么大的优化(尽管使用基于组的子对象应该通过避免一些缓冲来有所帮助;在子对象
[ProtoMember(... {here})]
和[ProtoInclude(... {here})]
中添加DataFormat=DataFormat.Group
)。
如果问题不是“ 1”,那么完全可以彻底检查内部结构的v2(当前可以作为alpha或来源)可能很值得尝试。
要获得更详细的答案,我需要一个完全可复制的示例进行调查。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。