YJIT Benchmarks

Details for Benchmarks at 2022-02-19 19:12:44

Overall YJIT is 32.8% faster than interpreted CRuby!
On Railsbench specifically, YJIT is 28.7% faster than CRuby!

The basic "faster" measurement is the geomean of all "headlining" x86 benchmarks on this page.

Headlining Benchmarks

These are "headlining" because the "overall" speedup above is based on these benchmarks specifically.

Speed of each Ruby implementation (iterations/second) relative to the CRuby interpreter. Higher is better.

Other Benchmarks

Speed of each Ruby implementation (iterations/second) relative to the CRuby interpreter. Higher is better.

MicroBenchmarks

Speed of each Ruby implementation (iterations/second) relative to the CRuby interpreter. Higher is better.

Want Raw Graphs and CSV?

Benchmarks Speed Details

Benchmark Memory Usage Details

Number of Iterations and Warmups Tested

bench No JIT warmups No JIT iters MJIT3.0 warmups MJIT3.0 iters MJIT warmups MJIT iters YJIT warmups YJIT iters
activerecord 5 178 20 178 75 178 20 178
hexapdf 5 15 20 15 20 15
liquid-render 5 154 20 154 75 154 20 154
mail 5 121 20 121 75 121 20 121
psych-load 5 15 20 15 75 15 20 15
railsbench 5 15 20 15 75 15 20 15
binarytrees 5 75 20 75 75 75 20 75
discourse 5 33 20 33 75 33 20 33
erubi 5 49 20 49 75 49 20 49
erubi_rails 5 940 20 940 75 940 20 940
fannkuchredux 5 15 20 15 75 15 20 15
lee 5 21 20 21 75 21 20 21
nbody 5 287 20 287 75 287 20 287
optcarrot 5 15 20 15 75 15 20 15
rubykon 5 15 20 15 37 15 20 15
30k_ifelse 5 55 20 55 75 55 20 55
30k_methods 5 22 20 22 30 22 20 22
cfunc_itself 5 423 20 423 75 423 20 423
fib 5 320 20 320 75 320 20 320
getivar 5 762 20 762 75 762 20 762
keyword_args 5 377 20 377 75 377 20 377
respond_to 5 102 20 102 75 102 20 102
setivar 5 1688 20 1688 75 1688 20 1688

Different Ruby configurations want different amounts of warmup. With no JIT, CRuby needs hardly any. YJIT and MJIT 3.0 both warm up quite quickly, while MJIT in 3.1 often slows down for a time as it compiles, after an unpredictable delay.

Benchmark YJIT Stats

Hover your cursor over the benchmark names for descriptions of each benchmark.

bench Exit Report Inline Outlined Comp iSeqs Comp Blocks Inval Inval Ratio Bind Alloc Bind Set Const Bumps
activerecord (click) 994321 761713 185 1199 0 0% 0 0 0
hexapdf (click) 1118737 916696 599 8170 613 7% 0 0 320
liquid-render (click) 492305 392233 143 1538 95 6% 0 0 1
mail (click) 900625 674889 324 5508 125 2% 0 0 39
psych-load (click) 334865 264786 59 434 1 0% 0 0 0
railsbench (click) 2534929 1932838 1297 9339 268 2% 0 0 26
binarytrees (click) 151121 116067 11 59 0 0% 0 0 0
discourse (click) 22425105 11298197 3147 280884 257156 91% 2 0 133
erubi (click) 325905 258141 10 79 0 0% 0 0 0
erubi_rails (click) 1910033 1438959 262 1877 18 0% 0 0 3
fannkuchredux (click) 164561 126387 8 189 0 0% 0 0 0
lee (click) 376785 297229 45 587 69 11% 0 0 12
nbody (click) 160081 122890 10 159 0 0% 0 0 0
optcarrot (click) 487313 428520 198 3576 20 0% 0 0 0
rubykon (click) 292689 236476 140 1536 1 0% 0 0 0
30k_ifelse (click) 5539857 4336013 9263 57805 0 0% 0 0 0
30k_methods (click) 2155537 1644804 5782 19362 0 0% 0 0 0
cfunc_itself (click) 149777 114647 8 50 0 0% 0 0 0
fib (click) 148177 114304 8 39 0 0% 0 0 0
getivar (click) 150097 116766 8 66 0 0% 0 0 0
keyword_args (click) 150161 114959 9 52 0 0% 0 0 0
respond_to (click) 151953 116101 8 65 0 0% 0 0 0
setivar (click) 150097 115290 8 39 0 0% 0 0 0

YJIT stats correspond to the YJIT stats exit report.

Note: currently, all stats are collected on x86_64, not ARM.

Raw JSON data files

All graphs and table data in this page comes from processing these data files, which come from benchmark runs.