Rails 的 enum 优化:从 JIT 视角看性能
Rails Is a JIT Compiler

文章标题虽然说是 Rails 是一个 JIT 编译器,但这其实是个引子。我们真正要探讨的是如何在运行时生成代码来优化 Rails 的 enum 功能。Sam 在 Roundhouse 项目中提出疑问,是否可以通过在构建阶段内联所有动态行为来提升性能。经过分析,我们发现 Rails 的 enum 实现虽然已经避免了完全动态查找,但仍使用了 public_send 和 define_method 等动态机制,导致性能瓶颈。通过将 enum 值直接烧录到方法中,并使用 module_eval 生成静态方法,我们显著提升了性能。测试显示,在启用 ZJIT 的情况下,shippable? 方法的执行速度从 3.812M i/s 提升至 18.509M i/s。这次优化不仅证明了静态优于动态,也表明无需自定义编译器,通过上游库的代码生成即可解决性能问题。
静态优于动态,把常量烧录进去,public_send 太慢了!
HN 评论区
10- matltc
如果你觉得这篇文章有趣,尤其是如果你写 Ruby,那我极力推荐《Metaprogramming Ruby》。它从根本上改变了我对编程的思考方式,让我意识到,当人们摆脱教条式的、通用的最佳实践束缚时,原来还能做到这么多。书中对这些主题进行了详尽的探讨,并大量引用了 ActiveRecord 以及许多其他 gem 的实现案例。
- twiss
class Order < ActiveRecord::Base
enum :status, { pending: 0, paid: 1, shipped: 2, refunded: 3 }
def shippable?
paid? && !refunded?
end
end
有点跑题,但既然 `:status` 是个 enum,那么 `paid? && !refunded?` 其实就等价于 `paid?`。
- WesolyKubeczek
点开文章
> 标题就是为了诱骗你点开这篇文章的。
关掉文章