Вопрос производительности Serialization protobuf-net - PullRequest
1 голос
/ 19 апреля 2011

Я начал тестировать protobuf-net для сериализации. Я видел тесты (http://www.servicestack.net/benchmarks/NorthwindDatabaseRowsSerialization.100000-times.2010-08-17.html), которые предлагали быструю сериализацию и меньшие файлы.

Я действительно вижу огромную разницу в размере создаваемых файлов. Тем не менее, скорость, которую я вижу, находится в пределах 5% от DataContractSerializer WCF.

Это заставило меня задуматься, делаю ли я что-то не так?

Вот код моих тестов:

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

В моем списке около 73 тыс. Предметов. Каждый элемент не слишком большой, хотя в DRFDataRow есть много полей (около 50).

П.С .: Я не жалуюсь, я очень доволен результатами, поскольку размер сериализованных результатов намного меньше, мне просто интересно, могу ли я также воспроизвести увеличение скорости, которое я видел в тестах.

1 Ответ

1 голос
/ 19 апреля 2011

В этом примере не совсем ясно, где начинается и заканчивается время - например, если вы включаете время для извлечения данных из IQueryable[<T>], то это, скорее всего, будет узким местом. Контракты выглядят хорошо; если хотите, возможны небольшие оптимизации, но ничего особенного (хотя использование подобъектов на основе группы должно немного помочь, избегая некоторой буферизации; добавьте DataFormat=DataFormat.Group к подобъекту [ProtoMember(... {here})] и [ProtoInclude(... {here})]).

Если проблема не в IQueryable[<T>], то, возможно, стоит попробовать v2 (в настоящее время доступный как альфа-версия или как источник), который полностью пересматривает внутреннее устройство.

Для более подробного ответа мне понадобится полностью воспроизводимый пример для расследования.

...