客户端配置文件优化策略

简介:

前要

一般游戏策划给的配置都是用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

性能走势图:
Blog%2FUSparkle_%20Configuration%2F2.png

2、FastJson
Blog%2FUSparkle_%20Configuration%2F3.png

GC量:25.4 MB
耗时:199.72 ms

性能走势图:
Blog%2FUSparkle_%20Configuration%2F4.png

3、System.Net.Json
Blog%2FUSparkle_%20Configuration%2F5.png

GC量:151.2 MB
耗时:1657.7 ms

性能走势图:
Blog%2FUSparkle_%20Configuration%2F6.png

4、NewtonJson
Blog%2FUSparkle_%20Configuration%2F7.png

GC量: 7.7 MB
耗时:266.84 ms

性能走势图:
Blog%2FUSparkle_%20Configuration%2F8.png


二、二进制读取测试

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

文件头(包括信息以及有效性标识)
—————————————————————————
数据VALUE部分
—————————————————————————
数据KEY部分
—————————————————————————

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

1、只读取二进制KEY部分
Blog%2FUSparkle_%20Configuration%2F9.png

GC量:1.6 MB
耗时:10.06 ms

性能走势图:
Blog%2FUSparkle_%20Configuration%2F10.pn

2、二进制全部读取
Blog%2FUSparkle_%20Configuration%2F11.pn

GC量:6.5 MB
耗时:119.41 ms

性能走势图:
Blog%2FUSparkle_%20Configuration%2F12.pn

3、协程每次500条,全部读取
Blog%2FUSparkle_%20Configuration%2F13.pn

GC最高峰值:462.5 KB
耗时最高峰值:17.06 ms
回调全部读取完成消耗时间:
Blog%2FUSparkle_%20Configuration%2F14.pn

性能走势图:
Blog%2FUSparkle_%20Configuration%2F15.pn

4、协程只读取KEY

Blog%2FUSparkle_%20Configuration%2F16.pn
Blog%2FUSparkle_%20Configuration%2F17.pn

GC最高峰值:0.7 MB
耗时最高峰值:13.97 ms
回调全部读取完成消耗时间:
Blog%2FUSparkle_%20Configuration%2F18.pn

性能走势图:
Blog%2FUSparkle_%20Configuration%2F19.pn


三、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异步预加载完,再执行解析,尽量将内存峰值降低,防止因为配置文件导致堆内存过高。


五、示例工程

地址:https://github.com/billwillman/NsConfigLib

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);

ConfigDictioanry示例

Dictionary<KEY, Vo>对应ConfigVoMap<KEY, Vo>
Dictionary<KEY, List<Vo>对应ConfigVoListMap<KEY, Vo>
Dictionary<KEY1, Dictionary<KEY2, Vo>对应ConfigVoMapMap<KEY1, KEY2, Vo>

ConfigVoListMap<KEY, Vo> map = new ConfigVoListMap<KEY, Vo>();

// 读取全部:
map .LoadFromTextAsset
map.LoadFromBytes

// 预加载方式
map.Preload(m_FileName, m_Mono, OnEnd, OnProcess);
  1. 测试场景:
    Untitled和Test1场景均是测试场景分别测试List结构和Dictionary结构。






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
域名解析 Kubernetes Java
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
2602 1
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
|
9月前
|
存储 druid 关系型数据库
MySQL数据库优化的方法和策略
MySQL数据库优化的方法和策略
|
9月前
|
负载均衡 算法 应用服务中间件
Nginx负载均衡的算法策略
Nginx负载均衡的算法策略
80 1
|
网络协议 关系型数据库 Unix
OushuDB-客户端认证-配置方法
OushuDB-客户端认证-配置方法
66 0
|
监控
zabbix配置自动发现主机和自动关联模板
zabbix配置自动发现主机和自动关联模板
287 0
zabbix配置自动发现主机和自动关联模板
|
Java 开发者 Spring
项目启动加载限流规则代码|学习笔记
快速学习项目启动加载限流规则代码
66 0
|
存储 负载均衡 算法
RPC框架(6 - 实现自动注销和负载均衡策略)
RPC框架(6 - 实现自动注销和负载均衡策略)
|
应用服务中间件 nginx C语言
Nginx集成Lua实现根据POST请求报文内容自定义负载策略
上游服务调用下游服务的接口,部分接口业务高峰期请求量大,下游服务器压力很大,会影响到其它接口的访问。如果通过增加下游服务器横向扩容会增加成本,且在业务高峰期还是有可能影响其他接口。所以需要使用Lua配置一种可以根据报文内容进行负载的策略(调用接口的URL是固定的,下游服务通过解析报文调用对应接口)。
538 0
|
存储 数据库
SqlServer 更改复制代理配置文件参数及两种冲突策略设置
原文:SqlServer 更改复制代理配置文件参数及两种冲突策略设置 由于经常需要同步测试并更改代理配置文件属性,所以总结成脚本,方便测试. 可更新订阅的冲突策略有两种情况:一是在发布中冲突,即订阅数据到发布时冲突;二是在订阅冲突,发布数据到订阅时冲突。
1382 0