zoukankan      html  css  js  c++  java
  • 简单测试Newtonsoft.json JObject内存占用分配

    前言

    最近在优化一个项目,发现使用asp.net api时候发现内存占用过高。从中发现有某处地方直接使用Newtonsoft.json 的JArray对象序列化后返回HttpResponseMessage,
    也有一部分是直接返回JArray,后来怀疑JObject内存占用过高,此函数是使用队列来生成报表文件数据量比较大,而传输方式使用Json,解析为了方便而直接使用JArray.Parse,
    改为反序列化IList<IDictionary<string,object>>后有所改观;经笔者测试发觉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<string,object>来作为JObject的替代测试

     

    2.使用Newtonsoft.json JObject测试

     

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

    3.使用JsonTextWriter测试如下

     

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

    下载源代码

    结语

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

    JObject可以使用字典或者实体模型方式来代替,然后使用JsonConvert.SerializeObject 序列化。

    作者:JohnWu
    出处:http://www.cnblogs.com/johnwu/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
    如有问题,可以通过v.la@Live.cn 联系我,非常感谢。

  • 相关阅读:
    js 遇到问题
    table 排序 添加 删除 等操作
    json对象
    .style, .getComputedStyle(),.currentStyle区别
    3个div 宽度移入移出时变化
    运动 js
    OWASP Top 10之文件上传漏洞简析(二)
    owasp top10 之文件上传漏洞简析
    前台实现ajax 需注意的地方
    apache-Rewrite重写规则配置
  • 原文地址:https://www.cnblogs.com/johnwu/p/2917286.html
Copyright © 2011-2022 走看看