优化 Ruby 的 JSON,第 7 部分

主要观点:对ruby/json进行解析优化,包括批量 API、避免双重扫描、避免无用复制、避免重复工作等方面,最终在json 2.9.0中完成优化并与其他库对比性能。
关键信息

  • 批量 API:通过使用栈来存储 JSON 对象内容,避免多次哈希和内存分配,使twitter.json基准测试提速 22%。
  • 避免双重扫描:优化 JSON 字符串解析,对于简单字符串有快速路径,但对twitter.json的影响不大。
  • 避免无用复制:实现整数解析的快速路径函数,减少rb_cstr2inum的调用,对微基准测试和实际基准测试都有较好效果。
  • 避免重复工作:将先解析浮点数再解析整数的方式改为直接解析数字,使twitter.jsoncitm_catalog.json提速 5%。
    重要细节
  • Ruby 哈希有内部限制,小于 8 个元素时使用简单数组,超过 8 个元素自动转换为哈希表。
  • rb_hash_aset在解析 JSON 时花费时间较多,是优化的重点。
  • Ragel 解析器输出的代码较难理解和调试,影响核心解析部分的改进。
  • 未来计划放弃 Ragel 并使用更简单的递归下降解析器,以及改进解析器和编码器的 API 以降低设置成本。
阅读 9
0 条评论