gpt4 book ai didi

c# - 在 C# 中使用 ArrayPool 重用从字符串到字节数组转换的内存?

转载 作者:太空宇宙 更新时间:2023-11-03 12:02:41 25 4
gpt4 key购买 nike

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

应用程序必须以 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 开箱即用并且应用程序使用没有序列化属性的第三方类型。

最佳答案

如果性能和内存分配是主要问题,您应该强烈考虑使用 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 序列化进行了高度优化,并且不包含网络传输中未使用的任何内容。

祝你好运!

关于c# - 在 C# 中使用 ArrayPool 重用从字符串到字节数组转换的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com