Ruby Benchmarks

Details for Benchmarks at 2026-08-23 00:33:55 UTC

YJIT metrics from the ruby-bench suite using Ruby 2e2b54648c.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 98.9% faster than CRuby 4.1.0dev
  • 9.0% faster than YJIT 3.4.7
On railsbench it is
  • 115.2% faster than CRuby 4.1.0dev
  • 15.6% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 5 minutes
aarch64 runtime: 7 hours, 47 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.4.7 warmups CRuby 3.4.7 iters CRuby 4.1.0dev warmups CRuby 4.1.0dev iters YJIT 3.4.7 warmups YJIT 3.4.7 iters YJIT 4.1.0dev warmups YJIT 4.1.0dev iters
activerecord 5 92 5 97 50 196 50 234
chunky-png 5 32 5 32 50 33 50 26
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 447 50 619 50 683
liquid-compile 5 421 5 522 50 582 50 847
liquid-il 5 67 5 69 50 116 50 135
liquid-render 5 170 5 173 50 430 50 472
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 213 50 254 50 298
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 157 50 245 50 246
ruby-lsp 5 153 5 162 50 235 50 234
sequel 5 425 5 464 50 591 50 665
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 30 50 12 50 18
addressable-getters 5 165 5 178 50 184 50 217
addressable-join 5 75 5 85 50 66 50 85
addressable-merge 5 161 5 166 50 222 50 249
addressable-new 5 352 5 357 50 519 50 555
addressable-normalize 5 52 5 59 50 60 50 72
addressable-parse 5 104 5 111 50 104 50 124
addressable-setters 5 185 5 195 50 234 50 257
addressable-to-s 5 164 5 177 50 183 50 214
binarytrees 5 81 5 87 50 136 50 147
blurhash 5 84 5 86 50 145 50 145
erubi 5 139 5 148 50 136 50 155
etanni 5 101 5 80 50 73 50 46
fannkuchredux 5 55 5 56 50 100 50 112
fluentd 5 58 5 65 50 27 50 47
gcbench 5 10 5 10 50 10 50 16
graphql 5 367 5 476 50 577 50 991
graphql-native 5 57 5 87 50 22 50 68
knucleotide 5 163 5 154 50 117 50 108
lee 5 23 5 32 50 10 50 19
matmul 5 53 5 49 50 87 50 98
nbody 5 249 5 254 50 663 50 629
nqueens 5 119 5 127 50 554 50 595
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 184 50 696 50 807
protoboeuf-encode 5 201 5 208 50 793 50 784
rack 5 439 5 448 50 723 50 725
ruby-json 5 84 5 116 50 51 50 94
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 23 50 10 50 10
splay 5 208 5 213 50 250 50 291
string_malloc_pressure 5 146 5 32 50 103 50 10
sudoku 5 48 5 49 50 155 50 173
tinygql 5 41 5 45 50 40 50 56
30k_ifelse 5 28 5 28 50 184 50 184
30k_methods 5 38 5 40 50 457 50 458
attr_accessor 5 157 5 188 50 1833 50 1908
cfunc_itself 5 348 5 348 50 1255 50 1258
fib 5 125 5 142 50 939 50 939
getivar 5 216 5 312 50 2306 50 2428
getivar-module 5 103 5 136 50 89 50 124
keyword_args 5 102 5 98 50 1240 50 1243
loops-times 5 22 5 26 50 63 50 61
object-new 5 268 5 485 50 297 50 1506
object-new-initialize 5 169 5 262 50 260 50 1023
object-new-no-escape 5 81 5 143 50 89 50 527
respond_to 5 139 5 127 50 3904 50 3900
ruby-xor 5 247 5 255 50 1306 50 1300
send_bmethod 5 118 5 122 50 5539 50 4528
send_cfunc_block 5 107 5 109 50 305 50 289
send_rubyfunc_block 5 196 5 204 50 1371 50 1375
send_rubyfunc_inline 5 30 5 37 50 297 50 298
setivar 5 359 5 348 50 4930 50 4922
setivar_object 5 341 5 286 50 760 50 791
setivar_young 5 341 5 286 50 808 50 831
str_concat 5 390 5 426 50 1196 50 943
structaref 5 153 5 190 50 1800 50 1880
structaset 5 198 5 273 50 369 50 493
throw 5 1109 5 1321 50 1444 50 1705

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) 1558696 1396324 204 2661 0 0% 0 0 79.017233
chunky-png (click) 320361 311527 79 1376 1 0% 0 0 37.60491
erubi-rails (click) 1376836 1205982 268 3626 23 0% 0 0 100.261105
hexapdf (click) 1526267 1314413 593 15740 45 0% 0 0 422.802916
liquid-c (click) 561082 507440 113 2224 5 0% 0 0 61.156326
liquid-compile (click) 473947 415387 146 2666 2 0% 0 0 73.14911
liquid-il (click) 611930 515500 70 2724 0 0% 0 0 79.372429
liquid-render (click) 665467 538609 130 2946 8 0% 0 0 76.993542
lobsters (click) 8541629 7224192 3126 63242 125 0% 0 0 2019.630671
mail (click) 868938 822278 345 7716 40 0% 0 0 206.837596
psych-load (click) 284278 270329 60 829 2 0% 0 0 23.117973
railsbench (click) 3351947 3076805 1591 19738 105 0% 0 0 534.020323
rubocop (click) 5760946 4955800 3000 57026 132 0% 6 0 1608.769192
ruby-lsp (click) 1049425 898143 408 7449 47 0% 1 0 197.650437
sequel (click) 520015 444181 11 119 0 0% 0 0 4.185836
shipit (click) 6882728 5754331 3135 50244 147 0% 0 0 1620.035896
addressable-equality (click) 320703 305006 44 1381 1 0% 0 0 32.838103
addressable-getters (click) 280205 247253 26 863 0 0% 0 0 19.733592
addressable-join (click) 286190 272577 24 941 0 0% 0 0 22.332751
addressable-merge (click) 289425 262800 27 896 0 0% 0 0 21.471925
addressable-new (click) 260266 239204 21 563 0 0% 0 0 13.329914
addressable-normalize (click) 315768 258718 43 1327 1 0% 0 0 31.021681
addressable-parse (click) 284668 251410 26 880 0 0% 0 0 20.937441
addressable-setters (click) 260749 233604 20 582 0 0% 0 0 13.924963
addressable-to-s (click) 279520 262275 26 849 0 0% 0 0 19.757427
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.751471
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.760117
erubi (click) 244921 210928 6 134 0 0% 0 0 3.82704
etanni (click) 30080 23270 8 114 0 0% 0 0 3.410216
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.807394
fluentd (click) 510478 390126 7 116 0 0% 0 0 3.666021
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.435214
graphql (click) 411384 400322 74 1940 18 0% 0 0 53.074546
graphql-native (click) 354998 349686 39 532 0 0% 0 0 13.71225
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.757459
lee (click) 319316 313221 50 1102 0 0% 0 0 30.340235
matmul (click) 11103 4709 8 136 0 0% 0 0 4.106902
nbody (click) 14448 21176 6 251 0 0% 0 0 6.094852
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.234167
optcarrot (click) 321897 302848 188 4600 34 0% 0 0 106.232724
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.526456
protoboeuf-encode (click) 242247 233890 14 1820 0 0% 0 0 42.047594
rack (click) 281785 249916 35 581 0 0% 0 0 14.721776
ruby-json (click) 20108 18120 8 210 0 0% 0 0 5.739342
rubyboy (click) 703550 678667 154 6875 42 0% 0 0 162.932262
rubykon (click) 146630 137068 137 2078 3 0% 0 0 54.57092
splay (click) 34617 22483 9 175 0 0% 0 0 5.337835
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.757983
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.794252
tinygql (click) 299245 245523 59 1026 5 0% 0 0 26.293981
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1869.838912
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 474.882365
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.078449
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.504469
fib (click) 2659 2995 3 30 0 0% 0 0 1.116991
getivar (click) 3789 6778 3 79 0 0% 0 0 1.908225
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.298023
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.809919
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.899641
object-new (click) 2406 2818 2 36 0 0% 0 0 0.999503
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.291537
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.746359
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.12626
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.791117
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.796557
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.297653
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.695451
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.042057
setivar (click) 2783 3726 3 46 0 0% 0 0 1.237423
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.401232
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.700082
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.426322
structaref (click) 4407 9095 3 88 0 0% 0 0 2.324918
structaset (click) 4113 5834 3 70 0 0% 0 0 1.773383
throw (click) 5953 4624 5 53 0 0% 0 0 1.754355

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.