Lua下的excel配置表极致优化
前言
项目中由于对于启动的优化,配置表量并不是特别大,但启动时长却不低,但对于应用类来说,对启动时长要求很严格。
我希望能做到毫秒级的加载体验,所以有了这个优化
旧方案
使用pb表配置,用工具转成pb格式,启动后加载到lua table
原始的pb文件在2M多,读取到内存中后,会增加20多M的内存开销
加载时长是高端机500ms多, 依赖机器性能,机器越差,加载越慢
另外,table还做了一个__newindex包装,是为了防止有代码误修改, 这个也增加了转换的时长
希望的优化目标是,这个启动加载能减少到100ms以下
新方案
使用一个自定义的二进制格式,也是用工具预先转换一下
【】文件头
【】列信息
【】数据表中全部字符串
【】不定长的数组
【】关键列查找表
【】行数据(定长结构,如果该列是字符串这类的不定长数据,则存储指针(偏移), 指向真正的数据
【0】 【1】 【2】 ... 【N】
【值或偏移】
通过重载 __index, 直接查找返回相应的变量,也正常的lua table访问基本一致
优化思路
1、采用内存文件格式,内存格式与文件格式完全一致,这个完全去除了数据解码的开销
这样配置文件大小与CPU的性能就不相关了,完全能满足毫秒级的加载体验
2、数据压缩,减少内存开销
自适应压缩整数,对于boo, 小于255的整数,使用1Byte存储
对于小于65535的整数,使用2Byte存储
对于 float, 如果事实上填的是整数,就自动转换成整数,按整型压缩
所有的字符串连续,通过偏移访问
扫描字符串,统计重码率,重码只存一个
找描字符串,拆分长字符串(比如路径),拆两成两个部分,公共路径只存一个,减少字符串的长度
3、查询速度优化
使用定长的二维格式,支持按行列随机访问,内存连续,Cpu Cache命中率高,能提供更高的查询性能。
经过这些优化后,测试下来,总体的文件大小比pb格式的还略小一些
优化效果
原始文件小2M,内存占用与文件大小完全一致,比pb略小
90个散文件加载时长降到25ms左右,如果打包成一个文件,4ms左右就可以完成加载
与机器CPU性能无关,只与文件io有关
相关文章
- Java之五种遍历Map集合的方式
- Jmeter扩展组件开发(7) - 自定义java请求的开发
- c字符串详细解析
- 断网了怎么办?那就快去体验【Microsoft Edge浏览器】提供的离线冲浪小游戏~娱乐一下
- 大一学生课设c——服装管理系统
- 1篇文章教会你MarkDown语法,从此开始博客之路
- 蓝桥杯每日一刷(第一天)
- 蓝桥杯每日一刷(第二天)
- 蓝桥杯每日一刷(第三天)
- 二叉树的三种遍历方式
- CONCATENATEX函数的不归路
- 搜索算法dfs和bfs解析(附有例题)
- 蓝桥杯每日一刷(第四天2016)
- 听说你还不会滑动窗口?来一篇文章带你学会滑动窗口算法
- Microsoft VS Code安装教程
- 肝一个周整理Java中容易混淆的基础知识
- ASICS的报表有哪些值得学习的地方?
- 蓝桥杯每日一刷(第六天)——暂会哈希
- 旅行商问题近似解——NP完全问题
- 【DHCP实验】使用三层交换机配置DHCP Server服务器(基于全局地址池配置)