简单测试Newtonsoft.json JObject内存占用分配

前言

最近在优化一个项目,发现使用asp.net api时候发现内存占用过高。从中发现有某处地方直接使用Newtonsoft.json 的JArray对象序列化后返回HttpResponseMessage,

也有一部分是直接返回JArray,后来怀疑JObject内存占用过高,此函数是使用队列来生成报表文件数据量比较大,而传输方式使用Json,解析为了方便而直接使用JArray.Parse,

改为反序列化IList>后有所改观;经笔者测试发觉JObject产生的对象确实对内存占用过多而无法准确释放。

测试

Release测试1W条数据每行30列

一、NewtonsoftTest

string guid = Guid.NewGuid().ToString();

JArray array = new JArray();
for (int i=0; i < 10000; i++) {
    JObject obj = new JObject();
    for (int c=1; c <= 10; c++) {
        obj["Id_" + c] = i;
        obj["Guid_" + c] = guid;
        obj["Sex_" + c] = i % 2 == 0;
    }
    array.Add(obj);
}

进程内存占用80M左右

二、FCLCollectionTest

string guid = Guid.NewGuid().ToString();
IList<IDictionary<string,object>> array = new List<IDictionary<string, object>>();
for (int i=0; i < 10000; i++) {
    var obj = new Dictionary<string, object>();
    for (int c=1; c <= 10; c++) {
        obj["Id_" + c] = i;
        obj["Guid_" + c] = guid;
        obj["Sex_" + c] = i % 2 == 0;
    }
    array.Add(obj);
}

进程内存占用28M左右

三、JsonWriterTest

string guid = Guid.NewGuid().ToString();
var jsonWriter = new JsonTextWriter(new StringWriter(CultureInfo.InvariantCulture));
jsonWriter.Formatting = Formatting.None;
jsonWriter.WriteStartArray();
for (int i=0; i < 10000; i++) {
    jsonWriter.WriteStartObject();
    for (int c=1; c <= 10; c++) {
        jsonWriter.WritePropertyName("Id_" + c);
        jsonWriter.WriteValue(i);
        jsonWriter.WritePropertyName("Guid_" + c);
        jsonWriter.WriteValue(guid);
        jsonWriter.WritePropertyName("Sex_" + c);
        jsonWriter.WriteValue(i % 2 == 0);
    }
    jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();

进程内存占用24M左右

分析

因笔者时间不多,只做了部分测试,使用CLRProfiler来分析程序的内存分配

1.使用Dictionary来作为JObject的替代测试

简单测试Newtonsoft.json JObject内存占用分配

简单测试Newtonsoft.json JObject内存占用分配

2.使用Newtonsoft.json JObject测试

简单测试Newtonsoft.json JObject内存占用分配

简单测试Newtonsoft.json JObject内存占用分配

可以从图中看到JProperty JValue JToken占用内存情况,而String,int,boolean属于测试数据的内存分配

3.使用JsonTextWriter测试如下

简单测试Newtonsoft.json JObject内存占用分配

简单测试Newtonsoft.json JObject内存占用分配

以上测试只截取部分图例,更深层次读者可以下载源代码自行调试观看。

下载源代码

结语

JsonTextWriter和拼写字符串区别不大,如果只是把json以字符串形式返回,尽量使用JsonTextWriter来处理,从而减少对象的生成。

JObject可以使用字典或者实体模型方式来代替,然后使用JsonConvert.SerializeObject 序列化。
原文链接: https://www.cnblogs.com/johnwu/archive/2013/02/19/2917286.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/78280

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午6:29
下一篇 2023年2月9日 下午6:30

相关推荐