优化 Ruby 的 JSON,第 2 部分

这篇文章是关于优化ruby/json性能的系列文章的一部分,主要介绍了两个优化措施:

  • 减少设置成本 - 参数解析版ruby/json的高设置成本使其在微基准测试中表现不佳。JSON.dump的参数解析方式存在问题,会进行额外的分配和方法查找,导致性能下降。通过重写dump方法,避免不必要的数组分配和respond_to?调用,减少了设置成本,在微基准测试中提高了 16%的性能。还提到了一个有趣的技巧,利用 Ruby 中参数的默认值是表达式的特性,但在这种情况下没有明显的效果。
  • 跳转表:在进一步优化ruby/json性能时,发现JSON::Generator::State#configure方法中大量时间花费在rb_hash_arefrb_hash_has_key上。C 代码中使用RTEST(rb_funcall(opts, i_key_p, 1, key))来检查选项哈希中是否包含键,这是昂贵的,因为没有缓存。可以使用hash_has_key函数来替代,或者利用 Ruby 的case语句生成跳转表来优化。将 C 代码重写为 Ruby 代码后,带来了 3%的性能提升,进一步将State#configure重写为使用case语句的跳转表后,又带来了 11%的性能提升,减少了 C 代码的维护,提高了整体效率。

文章作者表示只介绍了两个小的优化措施,可能还需要 5 或 6 部分来完成整个优化系列,并且希望后续不会像这部分一样有太多的题外话。编辑部分提到第三部分已经发布。

阅读 7
0 条评论