这篇文章是关于优化ruby/json
性能的系列文章的一部分,主要介绍了两个优化措施:
- 减少设置成本 - 参数解析版:
ruby/json
的高设置成本使其在微基准测试中表现不佳。JSON.dump
的参数解析方式存在问题,会进行额外的分配和方法查找,导致性能下降。通过重写dump
方法,避免不必要的数组分配和respond_to?
调用,减少了设置成本,在微基准测试中提高了 16%的性能。还提到了一个有趣的技巧,利用 Ruby 中参数的默认值是表达式的特性,但在这种情况下没有明显的效果。 - 跳转表:在进一步优化
ruby/json
性能时,发现JSON::Generator::State#configure
方法中大量时间花费在rb_hash_aref
和rb_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 部分来完成整个优化系列,并且希望后续不会像这部分一样有太多的题外话。编辑部分提到第三部分已经发布。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。