Как оптимизировать производительность ServiceStack.Text при десериализации в перечисления с DataContract - PullRequest
0 голосов
/ 26 октября 2018

Есть ли способ оптимизировать производительность ServiceStack.Text (версия 5.4.0) при десериализации перечисляемых значений в перечисления .Net с установленными атрибутами DataContract и EnumMember ?Я хотел бы использовать атрибуты EnumMember для определения сериализованных имен, но, к сожалению, ServiceStack.Text, по-видимому, требуется примерно в три раза больше времени для десериализации с использованием этого метода, в отличие от десериализации на основе простых имен элементов перечисления.

ДляНапример, рассмотрим простую тестовую программу на C #:

using ServiceStack;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Text;

namespace ServiceStackPerformance
{
    public class Program
    {
        [DataContract]
        enum DataContractEnum
        {
            [EnumMember(Value = "first")]
            First = 0,
            [EnumMember(Value = "second")]
            Second = 1,
        }

        enum PlainEnum
        {
            first = 0,
            second = 1,
        }

        [DataContract]
        class DataContractEnumList
        {
            [DataMember(Name = "values")]
            public List<DataContractEnum> Values { get; set; }
        }

        [DataContract]
        class PlainEnumList
        {
            [DataMember(Name = "values")]
            public List<PlainEnum> Values { get; set; }
        }

        static void Main(string[] args)
        {
            int size = 100000;
            string test = GenerateTestString(size);
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var dataContractEnumList = test.FromJson<DataContractEnumList>();
            var dataContractMs = stopwatch.ElapsedMilliseconds;

            stopwatch.Restart();
            var plainType = test.FromJson<PlainEnumList>();
            var plainMs = stopwatch.ElapsedMilliseconds;

            Console.WriteLine($"Deserializing input of size {2*size+1} to data contract enum took {dataContractMs} ms.");
            Console.WriteLine($"Deserializing input of size {2*size+1} to simple enum took {plainMs} ms.");
        }

        private static string GenerateTestString(int size)
        {
            var builder = new StringBuilder(10*size);
            builder.Append("{\"values\":[");
            for ( int i = 0; i < size; i++)
            {
                builder.Append("\"first\",\"second\",");
            }
            builder.Append("\"first\"]}");

            return builder.ToString();
        }
    }
}

вывод выглядит следующим образом:

Deserializing input of size 200001 to data contract enum took 3520 ms.
Deserializing input of size 200001 to simple enum took 1131 ms.

Существуют ли какие-либо методы кэширования или другие оптимизации производительности, которые я мог бы включить, чтобы избежать замедления?

1 Ответ

0 голосов
/ 26 октября 2018

Производительность Enums с [EnumMember] должна быть улучшена с этим коммитом и десериализацией Enums в этом коммите , который использует информацию из кэшированного перечисления.

Это изменениедоступно с v5.4.1, теперь доступно на MyGet .

...