本文章介绍如何利用Simdjson库加速易语言中的JSON数据解析过程,帮助开发者提高程序性能和效率。
今天更新了一些之前帖子提到的问题:
1. 封装了几个自定义函数(如 move_to_root, array_get_length, array_move_to_index),以减少 X64Call 的调用次数;
2. 实现了对类似 [0].A.B[0].C 路径的解析和取值功能。
接下来谈谈遇到的问题及一些体验:
1. 测试数据大小约为 96MB,可以正常处理;但更大一些(如 128MB)时会崩溃。崩溃发生在 ParsedJson.allocateCapacity 函数中。
(提示:对于这种规模的数据建议使用 SAX 方式解析)
2. 还有一个已知的隐蔽 BUG 可能与 print_ 函数有关:静态编译后,如果在 demo 中递归打印一个 Object(例如 [0]),再尝试解析时会在 iterator_free 出现崩溃。但如果只是取值则不会出现这种情况。
3. 该库会拷贝数据,在处理长数据时这不是最佳做法;感觉这个库更偏向于科研性质使用,与那些经过大量测试的老牌库相比,目前可能只有速度占优势。
4. 受限于机器或其他因素影响,用易语言无法达到宣传中的千兆字节每秒解析速度。不过几百 MBs 的性能还是有的。
5. 由于在解析时会拷贝数据,不确定是否会生成64位内存地址;暂时将指针到文本当作32位使用但心里没底,请 eWOW64Ext 开发者帮忙看一下...
6. 库采用的是10.0.17134.0 版本的 SDK MT 编译,不再支持 Windows XP。低版本的 SDK 无法通过编译。
(详情请查阅 MSDN)
7. 关于编译模式:使用 MinSizeRel 模式生成时会导致 double 取值异常,具体原因未深究;所以默认采用 Release 模式。
我会在附件中附上三种编译模式(RelWithDebInfo, MinSizeRel, Release)下生成的文件供研究。
8. 对 WOW64Ext 方面的知识了解有限,无法保证代码稳定性。抛砖引玉,请大家进群与我交流以封装完整模块和工具。