在C#中使用ArrayPool重新使用从String到字节数组转换的内存?

时间:2019-05-30 13:15:31

标签: c# .net memory-management garbage-collection

是否可以重复使用从字符串到字节数组转换的内存?

应用程序必须以60fps的速度通过网络发送大字符串。这似乎给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 个答案:

答案 0 :(得分:1)

如果主要考虑性能和内存分配,则应强烈考虑使用utf8json

utf8json可以一次性完成此操作,而不是同时使用慢速JsonConvert.SerializeObject方法和繁重的UTF8.GetBytes方法,

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

该库针对性能和低分配进行了优化,并用于ElasticSearch建议的.NET客户端之类的软件中。

还要确保DrawDescriptionLayer是为廉价JSON序列化高度优化的DTO,并且不包含网络传输中未使用的任何内容。

祝你好运!