Ruby Benchmarks

Details for Benchmarks at 2026-08-31 01:07:06 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 95.8% faster than CRuby 4.1.0dev
  • 7.8% faster than YJIT 3.4.7
On railsbench it is
  • 110.1% faster than CRuby 4.1.0dev
  • 13.6% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 14 minutes
aarch64 runtime: 7 hours, 53 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 90 5 95 50 196 50 207
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 450 50 614 50 683
liquid-compile 5 419 5 522 50 583 50 846
liquid-il 5 66 5 70 50 116 50 131
liquid-render 5 172 5 173 50 430 50 469
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 212 50 254 50 295
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 155 5 160 50 247 50 252
ruby-lsp 5 157 5 166 50 225 50 230
sequel 5 422 5 460 50 582 50 644
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 29 50 12 50 19
addressable-getters 5 164 5 176 50 184 50 213
addressable-join 5 73 5 84 50 64 50 83
addressable-merge 5 162 5 165 50 222 50 249
addressable-new 5 353 5 357 50 517 50 548
addressable-normalize 5 52 5 58 50 60 50 72
addressable-parse 5 103 5 111 50 104 50 124
addressable-setters 5 184 5 192 50 233 50 262
addressable-to-s 5 164 5 175 50 183 50 212
binarytrees 5 82 5 92 50 136 50 170
blurhash 5 84 5 87 50 145 50 145
erubi 5 130 5 149 50 138 50 151
etanni 5 100 5 77 50 72 50 44
fannkuchredux 5 55 5 55 50 101 50 109
fluentd 5 56 5 63 50 31 50 33
gcbench 5 10 5 11 50 10 50 17
graphql 5 371 5 481 50 565 50 982
graphql-native 5 59 5 89 50 22 50 70
knucleotide 5 163 5 151 50 117 50 105
lee 5 23 5 34 50 10 50 21
matmul 5 53 5 55 50 88 50 99
nbody 5 249 5 278 50 663 50 616
nqueens 5 119 5 126 50 554 50 595
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 172 5 190 50 693 50 808
protoboeuf-encode 5 201 5 206 50 791 50 791
rack 5 434 5 459 50 706 50 746
ruby-json 5 84 5 111 50 51 50 87
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 223 50 250 50 273
string_malloc_pressure 5 145 5 33 50 101 50 10
sudoku 5 48 5 50 50 155 50 173
tinygql 5 40 5 44 50 36 50 56
30k_ifelse 5 28 5 28 50 185 50 185
30k_methods 5 38 5 39 50 451 50 455
30k_variables 5 20 5 23 50 10 50 10
attr_accessor 5 157 5 193 50 1835 50 1913
cfunc_itself 5 348 5 349 50 1255 50 1258
fib 5 124 5 141 50 939 50 939
getivar 5 215 5 298 50 2314 50 2411
getivar-module 5 100 5 135 50 89 50 118
keyword_args 5 102 5 106 50 1239 50 1243
loops-times 5 23 5 27 50 63 50 62
object-new 5 268 5 666 50 297 50 1577
object-new-initialize 5 169 5 274 50 260 50 1024
object-new-no-escape 5 81 5 152 50 89 50 543
respond_to 5 139 5 129 50 3907 50 3911
ruby-xor 5 247 5 253 50 1305 50 1304
send_bmethod 5 118 5 121 50 5538 50 4526
send_cfunc_block 5 107 5 107 50 305 50 279
send_rubyfunc_block 5 196 5 205 50 1372 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 298
setivar 5 359 5 347 50 4930 50 4921
setivar_object 5 341 5 286 50 763 50 783
setivar_young 5 342 5 286 50 807 50 826
str_concat 5 401 5 422 50 1195 50 939
structaref 5 153 5 187 50 1801 50 1868
structaset 5 198 5 270 50 369 50 506
throw 5 1109 5 1418 50 1443 50 1863

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) 1562601 1389783 204 2677 0 0% 0 0 79.383069
chunky-png (click) 320885 256165 79 1378 1 0% 0 0 38.615298
erubi-rails (click) 1378589 1179408 268 3636 23 0% 0 0 94.732341
hexapdf (click) 1525073 1268432 593 15772 45 0% 0 0 426.189425
liquid-c (click) 560145 474916 113 2227 5 0% 0 0 62.032939
liquid-compile (click) 478011 397440 146 2677 2 0% 0 0 73.267247
liquid-il (click) 613812 501779 70 2738 0 0% 0 0 80.15178
liquid-render (click) 662941 586248 130 2949 8 0% 0 0 77.387342
lobsters (click) 8534327 7170694 3125 63429 125 0% 0 0 2028.551276
mail (click) 865767 837199 345 7750 40 0% 0 0 207.867581
psych-load (click) 286345 257175 60 836 2 0% 0 0 23.324073
railsbench (click) 3348307 2854292 1591 19816 105 0% 0 0 535.624362
rubocop (click) 5753188 4950935 3000 57125 133 0% 6 0 1615.106339
ruby-lsp (click) 1048218 981306 407 7460 46 0% 1 0 199.161394
sequel (click) 522714 489440 11 119 0 0% 0 0 4.300681
shipit (click) 7073648 5865793 3129 50397 147 0% 0 0 1616.675106
addressable-equality (click) 323609 284577 44 1382 1 0% 0 0 33.035577
addressable-getters (click) 283919 252020 26 863 0 0% 0 0 20.491156
addressable-join (click) 289356 260629 24 941 0 0% 0 0 23.029512
addressable-merge (click) 289442 263183 27 896 0 0% 0 0 21.314252
addressable-new (click) 264273 227934 21 564 0 0% 0 0 13.650371
addressable-normalize (click) 315182 308072 43 1328 1 0% 0 0 31.370514
addressable-parse (click) 286636 245723 26 880 0 0% 0 0 20.982644
addressable-setters (click) 260683 250534 20 582 0 0% 0 0 14.218447
addressable-to-s (click) 283527 234610 26 849 0 0% 0 0 19.989304
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.750795
blurhash (click) 52211 43340 27 606 0 0% 0 0 17.800462
erubi (click) 245427 211870 6 135 0 0% 0 0 3.835757
etanni (click) 30039 31433 8 114 0 0% 0 0 3.432417
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.868591
fluentd (click) 513853 436168 7 116 0 0% 0 0 3.663186
gcbench (click) 15503 8804 9 111 0 0% 0 0 3.434602
graphql (click) 414434 364198 74 1944 18 0% 0 0 53.068542
graphql-native (click) 358711 331163 39 532 0 0% 0 0 13.648217
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.68663
lee (click) 317512 271028 50 1107 0 0% 0 0 30.590806
matmul (click) 11076 4720 8 137 0 0% 0 0 4.174341
nbody (click) 14448 21176 6 251 0 0% 0 0 6.072544
nqueens (click) 22523 12434 5 390 0 0% 0 0 10.2472
optcarrot (click) 321897 302848 188 4600 34 0% 0 0 106.867044
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.673827
protoboeuf-encode (click) 242247 233890 14 1820 0 0% 0 0 42.362421
rack (click) 285034 213811 35 581 0 0% 0 0 15.239854
ruby-json (click) 19495 17440 8 211 0 0% 0 0 6.053988
rubyboy (click) 667863 638105 154 6525 42 0% 0 0 162.716764
rubykon (click) 146467 153511 137 2080 3 0% 0 0 54.428534
splay (click) 34536 22516 9 175 0 0% 0 0 5.291473
string_malloc_pressure (click) 4044 3947 6 50 0 0% 0 0 1.785251
sudoku (click) 51585 74062 7 873 0 0% 0 0 22.884767
tinygql (click) 301065 257416 59 1041 5 0% 0 0 26.822156
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1873.127825
30k_methods (click) 2278060 1643077 5780 19371 0 0% 0 0 475.544834
30k_variables (click) 8388846 23773775 302 188140 0 0% 0 0 4992.78806
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.088983
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.530234
fib (click) 2659 2995 3 30 0 0% 0 0 1.111588
getivar (click) 3789 6778 3 79 0 0% 0 0 1.905368
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.493132
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.825377
loops-times (click) 7066 8398 5 100 0 0% 0 0 3.066795
object-new (click) 2352 2825 2 38 0 0% 0 0 0.995125
object-new-initialize (click) 2988 3280 4 44 0 0% 0 0 1.313405
object-new-no-escape (click) 4240 4697 5 64 0 0% 0 0 1.768718
respond_to (click) 6370 6822 4 81 0 0% 0 0 2.122947
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.821369
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.795693
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.299973
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.778355
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.072323
setivar (click) 2783 3726 3 46 0 0% 0 0 1.249153
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.421169
setivar_young (click) 4273 4878 4 64 0 0% 0 0 1.722401
str_concat (click) 5772 6980 6 83 0 0% 0 0 2.414669
structaref (click) 4407 9095 3 88 0 0% 0 0 2.357714
structaset (click) 4113 5834 3 70 0 0% 0 0 1.80507
throw (click) 5953 4624 5 53 0 0% 0 0 1.774386

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.