YJIT Benchmarks

Details for Benchmarks at 2025-04-11 03:48:07 UTC

YJIT metrics from the yjit-bench suite using Ruby 8a15f80653.

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 89.5% faster than CRuby 3.5.0dev
  • 8.2% faster than YJIT 3.3.6
On railsbench it is
  • 103.1% faster than CRuby 3.5.0dev
  • 8.4% faster than YJIT 3.3.6
x86_64 runtime: 4 hours, 19 minutes
aarch64 runtime: 3 hours, 40 minutes

Performance on Headline Benchmarks

Speed of each Ruby implementation relative to the baseline CRuby measurement. Higher is better.

Memory Usage on Headline Benchmarks

Memory usage of each Ruby implementation relative to the baseline CRuby measurement. Lower is better.

Performance on Other Benchmarks

Speed of each Ruby implementation relative to the baseline CRuby measurement. Higher is better.

Memory Usage on Other Benchmarks

Memory usage of each Ruby implementation relative to the baseline CRuby measurement. Lower is better.

Performance on MicroBenchmarks

Speed of each Ruby implementation relative to the baseline CRuby measurement. Higher is better.

Memory Usage on MicroBenchmarks

Memory usage of each Ruby implementation relative to the baseline CRuby measurement. Lower is better.

Want Raw Graphs and CSV?

Benchmarks Speed Details

Benchmark Memory Usage Details

Number of Iterations and Warmups Tested

bench CRuby 3.3.6 warmups CRuby 3.3.6 iters CRuby 3.5.0dev warmups CRuby 3.5.0dev iters YJIT 3.3.6 warmups YJIT 3.3.6 iters YJIT 3.5.0dev warmups YJIT 3.5.0dev iters
activerecord 5 83 5 86 50 154 50 167
chunky-png 5 32 5 35 50 15 50 35
erubi-rails 5 16 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 409 5 430 50 573 50 642
liquid-compile 5 413 5 461 50 552 50 687
liquid-render 5 171 5 172 50 408 50 438
lobsters 5 20 5 19 50 10 50 10
mail 5 196 5 198 50 251 50 254
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 157 5 158 50 251 50 267
ruby-lsp 5 158 5 166 50 260 50 271
sequel 5 433 5 423 50 597 50 581
binarytrees 5 84 5 84 50 149 50 136
blurhash 5 82 5 88 50 127 50 145
erubi 5 125 5 143 50 91 50 147
etanni 5 89 5 101 50 54 50 70
fannkuchredux 5 52 5 58 50 100 50 107
fluentd 5 63 5 63 50 25 50 29
graphql 5 85 5 89 50 57 50 59
graphql-native 5 40 5 52 50 11 50 13
lee 5 23 5 25 50 10 50 10
matmul 5 51 5 54 50 85 50 93
nbody 5 248 5 273 50 577 50 705
nqueens 5 120 5 129 50 75 50 565
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 188 50 620 50 716
protoboeuf-encode 5 180 5 210 50 329 50 825
rack 5 593 5 631 50 951 50 1065
ruby-json 5 84 5 84 50 50 50 49
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 23 50 10 50 10
sudoku 5 48 5 51 50 164 50 161
tinygql 5 36 5 38 50 22 50 27
30k_ifelse 5 28 5 27 50 213 50 206
30k_methods 5 38 5 37 50 480 50 471
cfunc_itself 5 345 5 359 50 1147 50 1258
fib 5 127 5 146 50 910 50 933
getivar 5 207 5 339 50 2240 50 2768
keyword_args 5 107 5 111 50 1042 50 1243
loops-times 5 24 5 27 50 48 50 65
object-new 5 322 5 326 50 405 50 381
respond_to 5 133 5 143 50 3258 50 3980
ruby-xor 5 240 5 257 50 803 50 1373
setivar 5 358 5 543 50 3192 50 5878
setivar_object 5 355 5 458 50 699 50 806
setivar_young 5 367 5 456 50 737 50 817
str_concat 5 398 5 462 50 970 50 1225
throw 5 1263 5 1273 50 1774 50 1661

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 Compile Time MS
activerecord (click) 1417364 1193975 209 2202 0 0% 0 0 63.605725
chunky-png (click) 284480 245525 84 1124 1 0% 0 0 33.423522
erubi-rails (click) 1919067 1714753 260 2943 19 0% 0 0 81.819476
hexapdf (click) 1466397 1245787 595 13143 43 0% 0 0 382.226556
liquid-c (click) 501183 427788 115 1744 5 0% 0 0 48.864985
liquid-compile (click) 392822 306260 146 2085 2 0% 0 0 65.086994
liquid-render (click) 579939 539395 132 2310 8 0% 0 0 65.352839
lobsters (click) 8146469 6754564 3160 52886 104 0% 0 0 1845.774186
mail (click) 746685 684266 342 5317 14 0% 0 0 158.453151
psych-load (click) 262561 249051 61 615 3 0% 0 0 19.313715
railsbench (click) 3235247 2742202 1645 16193 52 0% 0 0 466.569026
rubocop (click) 5660466 5000250 2887 50552 110 0% 4 0 1478.125863
ruby-lsp (click) 824649 740455 305 4727 24 0% 0 0 134.746704
sequel (click) 451932 412595 11 94 0 0% 0 0 3.55799
binarytrees (click) 7093 6143 6 52 0 0% 0 0 2.304474
blurhash (click) 50118 50863 27 438 0 0% 0 0 14.181198
erubi (click) 253003 207343 5 97 0 0% 0 0 3.248878
etanni (click) 30101 29597 8 88 0 0% 0 0 2.971541
fannkuchredux (click) 23031 13626 3 249 0 0% 0 0 7.360334
fluentd (click) 384876 341828 7 93 0 0% 0 0 3.228723
graphql (click) 398140 373691 66 676 0 0% 0 0 21.183019
graphql-native (click) 393007 345966 37 255 0 0% 0 0 8.800768
lee (click) 298092 237114 45 749 0 0% 0 0 23.611261
matmul (click) 10657 3512 8 109 0 0% 0 0 3.542566
nbody (click) 13050 17086 6 172 0 0% 0 0 4.34878
nqueens (click) 20163 27348 5 239 0 0% 0 0 6.85465
optcarrot (click) 318856 234467 188 4395 34 0% 0 0 104.093068
protoboeuf (click) 150678 129601 12 1479 0 0% 0 0 42.09158
protoboeuf-encode (click) 221062 212146 14 1220 0 0% 0 0 31.359238
rack (click) 259961 214456 32 385 0 0% 0 0 10.211826
ruby-json (click) 23859 20840 8 178 0 0% 0 0 5.068078
rubyboy (click) 687525 594282 177 5803 40 0% 0 0 144.207361
rubykon (click) 133501 111856 137 1482 3 0% 0 0 42.986371
sudoku (click) 45311 40871 7 516 0 0% 0 0 15.492424
tinygql (click) 288563 247240 58 762 5 0% 0 0 21.964634
30k_ifelse (click) 5658774 5284843 9259 51667 0 0% 0 0 1411.886643
30k_methods (click) 2234569 1592883 5778 19351 0 0% 0 0 450.501029
cfunc_itself (click) 5130 4086 4 47 0 0% 0 0 1.306924
fib (click) 2599 2861 3 26 0 0% 0 0 0.973319
getivar (click) 3501 4713 3 51 0 0% 0 0 1.313457
keyword_args (click) 6320 4813 5 49 0 0% 0 0 1.598043
loops-times (click) 6688 7405 5 70 0 0% 0 0 2.308722
object-new (click) 1918 2093 2 22 0 0% 0 0 0.848996
respond_to (click) 5868 6227 4 62 0 0% 0 0 1.710634
ruby-xor (click) 5331 6009 4 64 0 0% 0 0 1.892591
setivar (click) 2652 3389 3 31 0 0% 0 0 1.00356
setivar_object (click) 3181 3537 3 33 0 0% 0 0 1.098601
setivar_young (click) 3891 4259 4 41 0 0% 0 0 1.339906
str_concat (click) 5469 6016 6 62 0 0% 0 0 1.959517
throw (click) 5848 4291 5 46 0 0% 0 0 1.64377

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.