YJIT Benchmarks

Details for Benchmarks at 2025-08-03 04:04:37 UTC

YJIT metrics from the yjit-bench suite using Ruby 30a20bc166.

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 85.8% faster than CRuby 3.5.0dev
  • 3.4% faster than YJIT 3.3.6
On railsbench it is
  • 98.0% faster than CRuby 3.5.0dev
  • 3.8% 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 82 5 83 50 154 50 156
chunky-png 5 31 5 32 50 14 50 23
erubi-rails 5 16 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 404 5 406 50 596 50 530
liquid-compile 5 410 5 468 50 548 50 689
liquid-render 5 170 5 171 50 390 50 385
lobsters 5 19 5 19 50 10 50 10
mail 5 194 5 177 50 249 50 193
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 206 50 216
ruby-lsp 5 140 5 145 50 223 50 242
sequel 5 426 5 429 50 595 50 585
shipit 5 10 5 10 50 10 50 10
binarytrees 5 84 5 79 50 146 50 118
blurhash 5 82 5 85 50 127 50 144
erubi 5 116 5 139 50 100 50 137
etanni 5 90 5 97 50 53 50 67
fannkuchredux 5 52 5 57 50 97 50 95
fluentd 5 62 5 59 50 24 50 24
graphql 5 335 5 436 50 452 50 912
graphql-native 5 52 5 76 50 15 50 57
lee 5 22 5 22 50 10 50 10
matmul 5 51 5 52 50 88 50 89
nbody 5 249 5 246 50 585 50 693
nqueens 5 120 5 128 50 74 50 566
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 180 5 181 50 620 50 730
protoboeuf-encode 5 178 5 194 50 327 50 793
rack 5 419 5 426 50 639 50 681
ruby-json 5 83 5 81 50 50 50 47
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 148
tinygql 5 40 5 42 50 40 50 50
30k_ifelse 5 28 5 27 50 215 50 184
30k_methods 5 38 5 38 50 480 50 468
attr_accessor 5 157 5 173 50 1722 50 1865
cfunc_itself 5 357 5 362 50 1137 50 1258
fib 5 127 5 143 50 903 50 929
getivar 5 213 5 284 50 2250 50 2375
keyword_args 5 99 5 108 50 1034 50 1243
loops-times 5 24 5 24 50 48 50 53
object-new 5 318 5 305 50 406 50 436
respond_to 5 133 5 135 50 3256 50 3930
ruby-xor 5 245 5 252 50 799 50 1278
setivar 5 361 5 343 50 3193 50 4910
setivar_object 5 353 5 308 50 671 50 607
setivar_young 5 368 5 311 50 702 50 618
str_concat 5 400 5 418 50 977 50 1188
throw 5 1272 5 1130 50 1728 50 1416

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) 1551298 1333444 206 2590 0 0% 0 0 75.384313
chunky-png (click) 363802 329822 74 1322 1 0% 0 0 39.273582
erubi-rails (click) 1938348 1632002 263 3732 22 0% 0 0 103.975265
hexapdf (click) 1560862 1300433 594 15644 45 0% 0 0 457.020658
liquid-c (click) 583269 536202 114 2217 5 0% 0 0 63.433278
liquid-compile (click) 505010 495040 146 2682 2 0% 0 0 80.81139
liquid-render (click) 691146 661281 131 2933 8 0% 0 0 81.964473
lobsters (click) 8582214 7139209 3161 63842 118 0% 0 0 2192.125285
mail (click) 874829 895913 342 7227 40 0% 0 0 211.400169
psych-load (click) 332969 309469 61 830 2 0% 0 0 24.579927
railsbench (click) 3381586 3021148 1649 20255 58 0% 0 0 585.309225
rubocop (click) 6154473 5327879 3013 63539 161 0% 6 0 1879.907579
ruby-lsp (click) 994746 921836 345 6749 48 0% 1 0 188.900294
sequel (click) 540530 473109 11 119 0 0% 0 0 4.183699
shipit (click) 7286567 6174251 3387 53875 212 0% 0 0 1739.445919
binarytrees (click) 154320 151361 6 64 0 0% 0 0 2.503285
blurhash (click) 199337 195889 27 603 0 0% 0 0 18.071484
erubi (click) 294150 268772 5 125 0 0% 0 0 3.834339
etanni (click) 176957 175574 7 98 0 0% 0 0 3.187397
fannkuchredux (click) 171788 169014 3 399 0 0% 0 0 11.144074
fluentd (click) 507160 420963 7 115 0 0% 0 0 3.806789
graphql (click) 444920 410063 72 1918 17 0% 0 0 55.608552
graphql-native (click) 388176 334455 39 532 0 0% 0 0 14.26353
lee (click) 358669 335148 49 1070 0 0% 0 0 32.372617
matmul (click) 158172 149053 8 132 0 0% 0 0 4.137595
nbody (click) 160937 156493 6 238 0 0% 0 0 5.951978
nqueens (click) 169699 173218 5 387 0 0% 0 0 10.325928
optcarrot (click) 472476 475516 188 4740 34 0% 0 0 113.654591
protoboeuf (click) 316633 370664 11 2828 0 0% 0 0 76.157639
protoboeuf-encode (click) 389300 386423 13 1805 0 0% 0 0 46.542843
rack (click) 322974 288688 35 580 0 0% 0 0 15.858951
ruby-json (click) 167719 163604 8 204 0 0% 0 0 5.806657
rubyboy (click) 738929 694986 154 6860 42 0% 0 0 174.806315
rubykon (click) 292478 289326 135 2060 3 0% 0 0 56.656761
sudoku (click) 198625 193641 6 863 0 0% 0 0 23.910194
tinygql (click) 347427 326071 59 1031 5 0% 0 0 28.010611
30k_ifelse (click) 6367005 5283666 9259 75432 0 0% 0 0 1964.167286
30k_methods (click) 2381613 1737482 5778 19357 0 0% 0 0 485.938964
attr_accessor (click) 151419 152402 3 78 0 0% 0 0 2.047898
cfunc_itself (click) 152174 148605 4 53 0 0% 0 0 1.44536
fib (click) 149706 139253 3 30 0 0% 0 0 1.009714
getivar (click) 150859 143060 3 78 0 0% 0 0 1.881863
keyword_args (click) 153379 149435 5 56 0 0% 0 0 1.767712
loops-times (click) 154019 144271 5 93 0 0% 0 0 2.81691
object-new (click) 149453 139076 2 36 0 0% 0 0 1.021825
respond_to (click) 153498 151269 4 80 0 0% 0 0 2.052176
ruby-xor (click) 152918 144943 4 100 0 0% 0 0 2.750694
setivar (click) 149830 139984 3 46 0 0% 0 0 1.198801
setivar_object (click) 150449 140214 3 49 0 0% 0 0 1.356403
setivar_young (click) 151347 149317 4 63 0 0% 0 0 1.658978
str_concat (click) 152894 151483 6 82 0 0% 0 0 2.464506
throw (click) 153000 149074 5 53 0 0% 0 0 1.755458

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.