简单测试Newtonsoft.json JObject内存占用分配
2013-10-21 20:16
495 查看
http://www.th7.cn/Program/net/201302/125491.shtml
前言
最近在优化一个项目,发现使用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 序列化。
相关文章推荐
- IOS开发之——objectForKey与valueForKey在NSDictionary中的差异
- iphone 线程总结— detachNewThreadSelector的使用
- 解决a different object with the same identifier value was already associated with the session错误
- Kobject Kset 解释 已及 相关注册函数API
- 在Objective-C中地址栏中汉子编码的解析与反解析
- 黑马程序员:Object类和equals、toString方法介绍
- how to compile Objective-C on ubuntu
- 水晶报表设计TextObject/PictureObject为不可见
- ObjectARX学习笔记(五)---- 如何弹出标准CAD文件打开和保存对话框acedGetFileD
- Objective-C学习笔记(二)–Category和Extension
- java设计模式之Active Object
- 主动对象(Active Object):用于并发编程的对象行为模式
- 消除Xcode 5中JosnKit类库的bit masking for introspection of objective-c 警告
- 【初学】Objective-C学习笔记-Objectiv-C
- Block Object
- Objective-c写冒泡排序
- IT English Collection(27)of Collection
- Objective-C for Windows [2013-10-21更新]
- 法线从object space到eye space的转换((normal matrix)
- 开发中常见问题集锦