2011-04-19 5 views
1

직렬화를 위해 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 .: 직렬화 된 결과 크기가 너무 작기 때문에 나는 결과에 매우 만족한다고 불평하지는 않습니다. 벤치 마크에서 본 속도 향상을 재현 할 수 있을지 궁금합니다.

답변

1

이 예에서는 타이밍이 시작되고 끝나는 곳이 완전히 명확하지 않습니다. 예를 들어 IQueryable[<T>]에서 데이터를 가져 오는 시간을 포함하는 경우 병목 현상이 발생할 가능성이 큽니다. 계약은 잘 보입니다. 원하는 경우 약간의 최적화가 가능하지만 중요한 것은 없습니다 (그룹 기반 하위 객체를 사용하면 버퍼링을 피함으로써 약간의 도움이되지만 하위 객체 [ProtoMember(... {here})][ProtoInclude(... {here})]DataFormat=DataFormat.Group을 추가해야 함).

IQueryable[<T>]이 아닌 경우 v2 (현재 알파 또는 소스로 제공됨)를 사용하여 내부 부품을 완전히 분해 할 가치가 있습니다.

더 자세한 답변을 원하시면 조사 할 수있는 완전히 재현 할 수있는 예제가 필요합니다.

+0

맞습니다. 물론 병목 현상은 거의 모든 시간대의 데이터를 가져옵니다. 메서드가 호출되기 전에 타이밍이 시작됩니다. 메서드를 변경하여 이미 가져온 목록을 가져오고 직렬화 만 수행하면 결과가 좋습니다. DataContractSerializer로 2.02 초, protobuf-net로 직렬화하려면 0.83 초. 필자는 실제 데이터를 사용할 때조차도 이러한 결과를 최적화해야한다고 생각하지 않습니다. – Gilles