Повторно использовать память из String в байтовый массив с помощью ArrayPool в C #? - PullRequest
2 голосов
/ 30 мая 2019

Возможно ли повторно использовать память, использованную в преобразовании массива строки в байты?

Приложение должно отправлять большие строки по сети со скоростью 60 кадров в секунду. Это, кажется, оказывает слишком большое давление на GC. Так можно ли как-то повторно использовать байтовые массивы, созданные преобразованием строк?

Это мои текущие методы сериализации:

public static byte[] SerializeJson(DrawDescriptionLayer layer)
{
    var s = JsonConvert.SerializeObject(layer, js);
    return Encoding.UTF8.GetBytes(s); //rent from array pool here
}

Или используя потоки:

public static byte[] SerializeJson2(DrawDescriptionLayer layer)
{
    using (var ms = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(ms, Encoding.UTF8))
    using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
    {
        JsonSerializer ser = JsonSerializer.Create(js);
        ser.Serialize(jsonWriter, layer);
        jsonWriter.Flush();
        return ms.ToArray(); //rent from array pool here
    }
}

Мне известно, что я должен написать собственный двоичный сериализатор, но Newtonsoft.Json работал из коробки, и приложение использует сторонние типы, которые не имеют атрибутов сериализации.

1 Ответ

1 голос
/ 03 июня 2019

Если производительность и выделение памяти являются основными проблемами, вам настоятельно рекомендуется использовать utf8json .

Вместо того, чтобы использовать медленный метод JsonConvert.SerializeObject, за которым следует тяжелое распределение UTF8.GetBytes, utf8json может сделать это за один проход:

public byte[] SerializeJson(DrawDescriptionLayer layer)
{
    return Utf8Json.JsonSerializer.Serialize(layer, Utf8Json.Resolvers.StandardResolver.Default);
}

Библиотека оптимизирована с точки зрения производительности и низкого выделения ресурсов и используется в программном обеспечении, подобном рекомендованному ElasticSearch клиенту .NET.

Также убедитесь, что DrawDescriptionLayer - это DTO, который высоко оптимизирован для дешевой сериализации JSON и не содержит ничего, что не используется при передаче по сети.

Удачи!

...