직렬화를 위해 protobuf-net을 테스트하기 시작했습니다. 벤치 마크 (http://www.servicestack.net/benchmarks/NorthwindDatabaseRowsSerialization.100000-times.2010-08-17.html)는 빠른 직렬화와 작은 파일을 제안했습니다.protobuf-net 직렬화 성능 질문
나는 실제로 을 볼 수 있습니다. 제작 된 파일의 크기가입니다. 그러나 내가 보는 속도는 WCF의 DataContractSerializer의 5 % 이내입니다.
내가 잘못한 게 궁금한가요? 내 목록에 대한 73K 항목이 있습니다
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
: 여기
내 테스트의 코드입니다. 각 항목은 DRFDataRow (약 50)에 많은 필드가있는 것만 큼 커지지 않습니다.
P.S .: 직렬화 된 결과 크기가 너무 작기 때문에 나는 결과에 매우 만족한다고 불평하지는 않습니다. 벤치 마크에서 본 속도 향상을 재현 할 수 있을지 궁금합니다.
맞습니다. 물론 병목 현상은 거의 모든 시간대의 데이터를 가져옵니다. 메서드가 호출되기 전에 타이밍이 시작됩니다. 메서드를 변경하여 이미 가져온 목록을 가져오고 직렬화 만 수행하면 결과가 좋습니다. DataContractSerializer로 2.02 초, protobuf-net로 직렬화하려면 0.83 초. 필자는 실제 데이터를 사용할 때조차도 이러한 결과를 최적화해야한다고 생각하지 않습니다. – Gilles