JSON

客户端配置文件优化策略

字号+ 作者:H5之家 来源:H5之家 2017-09-30 16:01 我要评论( )

前要 一般游戏策划给的配置都是用Excel,最后给程序是CSV、或者是转换成Json和二进制格式。本次测试中比对了市面上大部分Json库的性能比较,包括:LitJson、Syst

> 编程开发 > ASP.NET >

客户端配置文件优化策略 2017-09-25 11:06 出处:清屏网 人气: 

前要

一般游戏策划给的配置都是用Excel,最后给程序是CSV、或者是转换成Json和二进制格式。本次测试中比对了市面上大部分Json库的性能比较,包括:LitJson、System.Net.Json、FastJson、Newtonsoft.Json以及二进制格式。

其中,Json库中在全部同步读取解析最优秀的是Newtonsoft.json,GC以及速度最快。最差的是System.Net.Json,GC竟然高达100多MB,下文将介绍详细的测试过程。

一、Json库性能比较

测试方式:IO全部读取完成,测试平台为同一台PC机器,只测试其解析耗时以及GC量。

1、LitJson

GC量:15.7 MB

读取速度:494.61 ms

性能走势图:

 

2、FastJson

 

GC量:25.4 MB

耗时:199.72 ms

性能走势图:

 

3、System.Net.Json

 

GC量:151.2 MB

耗时:1657.7 ms

性能走势图:

 

4、NewtonJson

 

GC量: 7.7 MB

耗时:266.84 ms

性能走势图:

 

二、二进制读取测试

一般配置文件都分KEY和VALUE两部分,我们也将二进制数据也分为KEY和VALUE两部分保存,文件结构:

文件头(包括信息以及有效性标识)

—————————————————————————

数据VALUE部分

—————————————————————————

数据KEY部分

—————————————————————————

测试分为以下四种:只读取二进制KEY部分,二进制全部读取,二进制采用协程分步骤全部读取(测试中,默认每次读取500条数据,读完KEY,再读取VALUE),以及协程只读取KEY部分。

1、只读取二进制KEY部分

 

GC量:1.6 MB

耗时:10.06 ms

性能走势图:

 

2、二进制全部读取

 

GC量:6.5 MB

耗时:119.41 ms

性能走势图:

 

3、协程每次500条,全部读取

 

GC最高峰值:462.5 KB

耗时最高峰值:17.06 ms

回调全部读取完成消耗时间:

 

性能走势图:

 

4、协程只读取KEY

 

 

GC最高峰值:0.7 MB

耗时最高峰值:13.97 ms

回调全部读取完成消耗时间:

 

性能走势图:

 

三、Json库测试结论

1.NewtonJson库的GC量以及耗时最低,最差是System.Net.Json。

2.其中GC量大的原因是:System.Text.Encoding.UTF8.GetString函数,以及Json库内部字符串处理,本身IO读取产生的GC量相对比较小。

四、二进制优化策略

1.常用小配置文件可以采用一次性将KEY和VALUE全部读取;

2.数据列不是很多但数据量中等的配置,可以采用只读取KEY,用到取VALUE再读取策略;

3.数据列很多并且数据量很大的配置,可以采用全部异步,预加载的方式优化;

4.采用预加载的方式,可以将配置文件IO部分和解析部分执行分开,先IO异步预加载完,再执行解析,尽量将内存峰值降低,防止因为配置文件导致堆内存过高。

五、示例工程

地址:

1.考虑到很多项目都是Json格式,示例工程中,我们采用尽量兼容Json的结构方式,封装了一个ConfigDictionary类,用于针对模拟一部分Dictionary的操作,隔离掉解析操作。

2.支持三种Json定义方式的转换,Dictionary<KEY, Vo>、Dictionary<KEY, List> 、Dictionary<KEY1, Dictionary<KEY2, Vo>>, 其中Vo为数据。

3.使用方式很简单,Json解析方式, 以LITJson为例 :

LitJson.JsonMapper.ToObject<Dictionary<string, List<VO>>>(str);

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET中使用JSON方便实现前台与后台的数据交换

    ASP.NET中使用JSON方便实现前台与后台的数据交换

    2017-09-09 14:08

  • Dynemic Web Project中使用servlet的 doGet()方法接收来自浏览器客户端发送的add学生信息

    Dynemic Web Project中使用servlet的 doGet()方法接收来自浏览器客户

    2017-09-07 15:00

  • JSON学习笔记(一)

    JSON学习笔记(一)

    2017-09-06 14:27

  • Newtonsoft.Json(Json.net)的基本用法 JsonConvert.SerializeO

    Newtonsoft.Json(Json.net)的基本用法 JsonConvert.SerializeO

    2017-09-01 09:03

网友点评