是否可以重复使用从字符串到字节数组转换的内存?
应用程序必须以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开箱即用,该应用程序使用没有序列化属性的第三方类型。
答案 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,并且不包含网络传输中未使用的任何内容。
祝你好运!