YJIT Benchmarks

Details for Benchmarks at 2025-08-10 04:02:39 UTC

YJIT metrics from the yjit-bench suite using Ruby 2a6345e957.

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 85.2% faster than CRuby 3.5.0dev
  • 3.2% faster than YJIT 3.3.6
On railsbench it is
  • 97.3% faster than CRuby 3.5.0dev
  • 3.3% faster than YJIT 3.3.6
x86_64 runtime: 4 hours, 29 minutes
aarch64 runtime: 3 hours, 49 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 84 50 156 50 147
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 408 5 398 50 574 50 526
liquid-compile 5 410 5 469 50 538 50 706
liquid-render 5 171 5 171 50 407 50 382
lobsters 5 19 5 19 50 10 50 10
mail 5 190 5 171 50 240 50 199
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 140 5 141 50 202 50 215
ruby-lsp 5 141 5 148 50 233 50 234
sequel 5 425 5 431 50 597 50 587
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 116 5 142 50 100 50 142
etanni 5 90 5 97 50 53 50 68
fannkuchredux 5 52 5 58 50 97 50 100
fluentd 5 62 5 56 50 25 50 26
graphql 5 340 5 446 50 471 50 918
graphql-native 5 51 5 75 50 13 50 58
lee 5 22 5 22 50 10 50 10
matmul 5 51 5 48 50 88 50 90
nbody 5 249 5 244 50 585 50 670
nqueens 5 120 5 128 50 74 50 558
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 178 5 181 50 621 50 735
protoboeuf-encode 5 179 5 196 50 327 50 778
rack 5 422 5 436 50 644 50 678
ruby-json 5 84 5 81 50 50 50 46
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 21 50 10 50 10
sudoku 5 48 5 51 50 163 50 147
tinygql 5 40 5 43 50 42 50 48
30k_ifelse 5 28 5 27 50 215 50 184
30k_methods 5 38 5 38 50 481 50 472
attr_accessor 5 158 5 202 50 1721 50 1920
cfunc_itself 5 359 5 366 50 1137 50 1258
fib 5 127 5 140 50 902 50 930
getivar 5 213 5 284 50 2252 50 2381
keyword_args 5 104 5 107 50 1034 50 1243
loops-times 5 24 5 24 50 48 50 56
object-new 5 318 5 302 50 405 50 443
respond_to 5 134 5 135 50 3256 50 3932
ruby-xor 5 245 5 251 50 800 50 1279
setivar 5 368 5 346 50 3191 50 4917
setivar_object 5 353 5 302 50 672 50 608
setivar_young 5 367 5 313 50 704 50 614
str_concat 5 397 5 435 50 980 50 1203
throw 5 1272 5 1149 50 1747 50 1447

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) 1549325 1373326 206 2590 0 0% 0 0 74.909828
chunky-png (click) 364105 338314 74 1322 1 0% 0 0 38.603802
erubi-rails (click) 1932240 1656862 263 3692 22 0% 0 0 103.82219
hexapdf (click) 1552056 1397219 593 15656 45 0% 0 0 451.978753
liquid-c (click) 581988 543359 114 2217 5 0% 0 0 60.769754
liquid-compile (click) 496231 461238 146 2709 2 0% 0 0 79.01851
liquid-render (click) 689684 611044 131 2933 8 0% 0 0 80.139165
lobsters (click) 8572674 7293582 3164 63718 119 0% 0 0 2123.022929
mail (click) 874077 813429 342 7227 40 0% 0 0 202.352818
psych-load (click) 330780 307491 61 830 2 0% 0 0 25.177408
railsbench (click) 3379791 2992170 1649 20217 58 0% 0 0 588.885229
rubocop (click) 6153821 5318317 3013 63529 161 0% 6 0 1842.93014
ruby-lsp (click) 993860 855780 345 6749 48 0% 1 0 188.891326
sequel (click) 540530 456821 11 119 0 0% 0 0 4.063293
shipit (click) 7292384 6138243 3386 53890 212 0% 0 0 1734.719227
binarytrees (click) 154320 151361 6 64 0 0% 0 0 2.496872
blurhash (click) 199337 195889 27 603 0 0% 0 0 17.819684
erubi (click) 284638 266710 5 125 0 0% 0 0 3.910266
etanni (click) 176957 175574 7 98 0 0% 0 0 3.154186
fannkuchredux (click) 171788 169014 3 399 0 0% 0 0 11.010072
fluentd (click) 507160 486519 7 115 0 0% 0 0 3.847733
graphql (click) 444072 376595 72 1918 17 0% 0 0 54.316199
graphql-native (click) 377958 323515 39 532 0 0% 0 0 14.179219
lee (click) 348442 324361 49 1070 0 0% 0 0 31.447619
matmul (click) 158172 149053 8 132 0 0% 0 0 4.119357
nbody (click) 160937 156493 6 238 0 0% 0 0 5.84335
nqueens (click) 169699 173218 5 387 0 0% 0 0 10.22669
optcarrot (click) 472476 475516 188 4740 34 0% 0 0 112.291465
protoboeuf (click) 316633 370664 11 2828 0 0% 0 0 75.695543
protoboeuf-encode (click) 389300 386423 13 1805 0 0% 0 0 45.941504
rack (click) 323277 272564 35 580 0 0% 0 0 15.382371
ruby-json (click) 166990 162901 8 204 0 0% 0 0 5.700147
rubyboy (click) 737874 645050 154 6860 42 0% 0 0 172.920514
rubykon (click) 291698 263894 135 2052 3 0% 0 0 56.102062
sudoku (click) 198625 193641 6 863 0 0% 0 0 23.708337
tinygql (click) 346857 309155 59 1031 5 0% 0 0 27.051145
30k_ifelse (click) 6367005 5283666 9259 75432 0 0% 0 0 1952.591098
30k_methods (click) 2381613 1737482 5778 19357 0 0% 0 0 479.049722
attr_accessor (click) 151419 152402 3 78 0 0% 0 0 2.027281
cfunc_itself (click) 152174 148605 4 53 0 0% 0 0 1.410239
fib (click) 149706 139253 3 30 0 0% 0 0 1.016905
getivar (click) 150859 143060 3 78 0 0% 0 0 1.877407
keyword_args (click) 153379 149435 5 56 0 0% 0 0 1.733112
loops-times (click) 154019 144271 5 93 0 0% 0 0 2.72022
object-new (click) 149453 139076 2 36 0 0% 0 0 1.02553
respond_to (click) 153498 151269 4 80 0 0% 0 0 2.147833
ruby-xor (click) 152918 144943 4 100 0 0% 0 0 2.623392
setivar (click) 149830 139984 3 46 0 0% 0 0 1.195372
setivar_object (click) 150449 140214 3 49 0 0% 0 0 1.33155
setivar_young (click) 151347 149317 4 63 0 0% 0 0 1.664946
str_concat (click) 152894 151483 6 82 0 0% 0 0 2.447376
throw (click) 153000 149074 5 53 0 0% 0 0 1.777788

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.