RailsはJITコンパイラだった — enumの動的ディスパッチを潰して18倍高速化
Rails Is a JIT Compiler

Railsのenumが生成するメソッドはpublic_sendとブロックキャプチャで動的に値を参照しており、JITの恩恵を受けにくかった。これをmodule_evalによる文字列コード生成に置き換え、定数をメソッドに焼き込むことで、ZJIT環境下のベンチマークが約3.8M回/秒から18.5M回/秒へと大幅に改善。浮動小数点や特殊なenum名への対応など細かな落とし穴も紹介している。
静的な方が動的より優れている。定数は焼き込んでしまおう。特に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
記事を開く
> このタイトルは、あなたにこの記事を開かせるための釣りでした。しかし
記事を閉じる