YJIT Benchmarks

Details for Benchmarks at 2025-07-22 04:01:30 UTC

YJIT metrics from the yjit-bench suite using Ruby e77eee96a3.

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 89.7% faster than CRuby 3.5.0dev
  • 3.2% faster than YJIT 3.3.6
On railsbench it is
  • 111.6% faster than CRuby 3.5.0dev
  • 10.2% faster than YJIT 3.3.6
x86_64 runtime: 4 hours, 48 minutes
aarch64 runtime: 4 hours, 3 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 75 50 154 50 144
chunky-png 5 31 5 32 50 14 50 24
erubi-rails 5 16 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 410 5 410 50 596 50 543
liquid-compile 5 408 5 445 50 576 50 689
liquid-render 5 169 5 165 50 414 50 377
lobsters 5 19 5 19 50 10 50 10
mail 5 189 5 181 50 236 50 193
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 156 5 156 50 248 50 257
ruby-lsp 5 156 5 149 50 236 50 268
sequel 5 424 5 423 50 589 50 560
shipit 5 10 5 10 50 10 50 10
binarytrees 5 84 5 79 50 146 50 120
blurhash 5 82 5 86 50 127 50 144
erubi 5 118 5 144 50 101 50 130
etanni 5 91 5 99 50 53 50 68
fannkuchredux 5 52 5 57 50 97 50 95
fluentd 5 62 5 58 50 26 50 25
graphql 5 85 5 83 50 57 50 55
graphql-native 5 47 5 47 50 10 50 16
lee 5 23 5 22 50 10 50 10
matmul 5 51 5 53 50 88 50 78
nbody 5 244 5 253 50 585 50 647
nqueens 5 120 5 127 50 75 50 557
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 160 50 620 50 748
protoboeuf-encode 5 179 5 211 50 328 50 777
rack 5 585 5 620 50 944 50 1044
ruby-json 5 84 5 81 50 50 50 46
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 20 5 21 50 10 50 10
sudoku 5 48 5 52 50 162 50 139
tinygql 5 36 5 34 50 21 50 31
30k_ifelse 5 28 5 27 50 215 50 184
30k_methods 5 38 5 38 50 477 50 468
attr_accessor 5 157 5 187 50 1719 50 1894
cfunc_itself 5 349 5 348 50 1147 50 1258
fib 5 127 5 142 50 901 50 934
getivar 5 214 5 297 50 2253 50 2373
keyword_args 5 104 5 103 50 1041 50 1243
loops-times 5 24 5 25 50 48 50 56
object-new 5 322 5 306 50 405 50 450
respond_to 5 133 5 136 50 3257 50 3885
ruby-xor 5 245 5 252 50 799 50 1278
setivar 5 361 5 340 50 3191 50 4908
setivar_object 5 353 5 300 50 670 50 585
setivar_young 5 368 5 301 50 703 50 580
str_concat 5 398 5 426 50 982 50 1170
throw 5 1267 5 1126 50 1722 50 1426

Different Ruby configurations want different amounts of warmup. With no JIT, CRuby needs hardly any. YJIT warms up fairly quickly, while some JITs may start slower as they do more advanced compilation.

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) 1551716 1332209 206 2590 0 0% 0 0 74.611258
chunky-png (click) 375571 352225 74 1330 1 0% 0 0 38.341079
erubi-rails (click) 2016592 1774739 262 3661 21 0% 0 0 100.064573
hexapdf (click) 1553145 1323429 593 15611 43 0% 0 0 448.576787
liquid-c (click) 571693 536530 114 2217 5 0% 0 0 61.909799
liquid-compile (click) 493892 454492 146 2712 2 0% 0 0 80.024852
liquid-render (click) 682207 623415 131 2933 8 0% 0 0 82.165136
lobsters (click) 8566668 7180239 3171 63953 118 0% 0 0 2145.521917
mail (click) 864382 856933 342 7232 40 0% 0 0 203.634214
psych-load (click) 329068 297386 61 825 3 0% 0 0 23.980784
railsbench (click) 3433949 3163288 1655 20198 56 0% 0 0 576.130192
rubocop (click) 5953628 5140262 2886 61698 116 0% 4 0 1796.692258
ruby-lsp (click) 926073 865434 305 5956 29 0% 0 0 163.225214
sequel (click) 543701 475546 11 115 0 0% 0 0 4.153395
shipit (click) 7980147 6780363 3487 56907 234 0% 1 0 1839.8827
binarytrees (click) 154529 151621 6 64 0 0% 0 0 2.524435
blurhash (click) 199546 187957 27 603 0 0% 0 0 17.98823
erubi (click) 302586 279591 5 125 0 0% 0 0 3.835491
etanni (click) 176675 175462 7 98 0 0% 0 0 3.171674
fannkuchredux (click) 171997 177466 3 399 0 0% 0 0 10.991379
fluentd (click) 450399 409917 7 115 0 0% 0 0 3.79458
graphql (click) 494460 434537 66 1035 0 0% 0 0 28.832224
graphql-native (click) 452841 389018 37 399 0 0% 0 0 11.292529
lee (click) 363873 349526 45 1012 0 0% 0 0 29.613849
matmul (click) 158381 157505 8 132 0 0% 0 0 4.11668
nbody (click) 161146 148561 6 238 0 0% 0 0 5.811747
nqueens (click) 169908 181670 5 387 0 0% 0 0 10.271728
optcarrot (click) 472685 467604 188 4740 34 0% 0 0 111.555226
protoboeuf (click) 316842 420076 11 2828 0 0% 0 0 75.82579
protoboeuf-encode (click) 389509 501371 13 1805 0 0% 0 0 45.646191
rack (click) 314120 293596 31 496 0 0% 0 0 12.873837
ruby-json (click) 167199 163161 8 204 0 0% 0 0 5.722214
rubyboy (click) 760466 617681 177 6962 40 0% 0 0 178.834663
rubykon (click) 292687 273202 135 2060 3 0% 0 0 56.435952
sudoku (click) 198834 218477 6 863 0 0% 0 0 23.514384
tinygql (click) 356103 319670 58 977 5 0% 0 0 26.411337
30k_ifelse (click) 6367214 5226662 9259 75432 0 0% 0 0 1955.4426
30k_methods (click) 2381822 1737722 5778 19357 0 0% 0 0 487.017109
attr_accessor (click) 151628 144470 3 78 0 0% 0 0 2.034288
cfunc_itself (click) 152383 148865 4 53 0 0% 0 0 1.418234
fib (click) 149915 139513 3 30 0 0% 0 0 1.032281
getivar (click) 151068 143320 3 78 0 0% 0 0 1.895491
keyword_args (click) 153588 149675 5 56 0 0% 0 0 1.72518
loops-times (click) 154228 144531 5 93 0 0% 0 0 2.683673
object-new (click) 149662 147528 2 36 0 0% 0 0 1.050918
respond_to (click) 153707 151529 4 80 0 0% 0 0 2.03227
ruby-xor (click) 153127 153395 4 100 0 0% 0 0 2.701203
setivar (click) 150039 148436 3 46 0 0% 0 0 1.210809
setivar_object (click) 150658 148666 3 49 0 0% 0 0 1.353186
setivar_young (click) 151556 141385 4 63 0 0% 0 0 1.660955
str_concat (click) 153103 151743 6 82 0 0% 0 0 2.425665
throw (click) 153209 149334 5 53 0 0% 0 0 1.895289

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.