主要观点:对ruby/json
进行解析优化,包括批量 API、避免双重扫描、避免无用复制、避免重复工作等方面,最终在json 2.9.0
中完成优化并与其他库对比性能。
关键信息:
- 批量 API:通过使用栈来存储 JSON 对象内容,避免多次哈希和内存分配,使
twitter.json
基准测试提速 22%。 - 避免双重扫描:优化 JSON 字符串解析,对于简单字符串有快速路径,但对
twitter.json
的影响不大。 - 避免无用复制:实现整数解析的快速路径函数,减少
rb_cstr2inum
的调用,对微基准测试和实际基准测试都有较好效果。 - 避免重复工作:将先解析浮点数再解析整数的方式改为直接解析数字,使
twitter.json
和citm_catalog.json
提速 5%。
重要细节: - Ruby 哈希有内部限制,小于 8 个元素时使用简单数组,超过 8 个元素自动转换为哈希表。
rb_hash_aset
在解析 JSON 时花费时间较多,是优化的重点。- Ragel 解析器输出的代码较难理解和调试,影响核心解析部分的改进。
- 未来计划放弃 Ragel 并使用更简单的递归下降解析器,以及改进解析器和编码器的 API 以降低设置成本。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。