Ruby Benchmarks

Details for Benchmarks at 2026-07-31 00:57:27 UTC

YJIT metrics from the ruby-bench suite using Ruby 825c457945.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 95.9% faster than CRuby 4.1.0dev
  • 6.6% faster than YJIT 3.4.7
On railsbench it is
  • 116.9% faster than CRuby 4.1.0dev
  • 15.2% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 8 minutes
aarch64 runtime: 7 hours, 50 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 93 5 96 50 202 50 204
chunky-png 5 32 5 31 50 33 50 27
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 441 50 618 50 667
liquid-compile 5 420 5 514 50 584 50 829
liquid-il 5 67 5 68 50 116 50 125
liquid-render 5 173 5 174 50 434 50 462
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 206 50 255 50 293
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 155 50 247 50 240
ruby-lsp 5 157 5 163 50 229 50 224
sequel 5 428 5 465 50 597 50 659
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 17
addressable-getters 5 165 5 169 50 183 50 206
addressable-join 5 75 5 82 50 66 50 80
addressable-merge 5 161 5 156 50 222 50 231
addressable-new 5 349 5 340 50 521 50 519
addressable-normalize 5 53 5 58 50 60 50 69
addressable-parse 5 104 5 104 50 103 50 115
addressable-setters 5 184 5 182 50 234 50 250
addressable-to-s 5 165 5 168 50 181 50 206
binarytrees 5 82 5 88 50 136 50 168
blurhash 5 84 5 83 50 145 50 145
erubi 5 139 5 155 50 139 50 162
etanni 5 101 5 82 50 72 50 51
fannkuchredux 5 55 5 56 50 100 50 110
fluentd 5 59 5 60 50 20 50 28
gcbench 5 10 5 10 50 10 50 10
graphql 5 370 5 471 50 568 50 910
graphql-native 5 57 5 87 50 21 50 57
knucleotide 5 163 5 148 50 118 50 102
lee 5 23 5 32 50 10 50 21
matmul 5 53 5 51 50 88 50 97
nbody 5 250 5 255 50 663 50 699
nqueens 5 119 5 126 50 554 50 595
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 183 50 697 50 689
protoboeuf-encode 5 201 5 193 50 807 50 831
rack 5 445 5 470 50 718 50 772
ruby-json 5 84 5 113 50 50 50 93
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 201 50 250 50 238
string_malloc_pressure 5 147 5 33 50 101 50 10
sudoku 5 48 5 49 50 155 50 170
tinygql 5 41 5 43 50 40 50 51
30k_ifelse 5 28 5 28 50 186 50 185
30k_methods 5 38 5 39 50 456 50 455
attr_accessor 5 157 5 162 50 1831 50 1850
cfunc_itself 5 348 5 323 50 1255 50 1258
fib 5 125 5 133 50 939 50 937
getivar 5 210 5 309 50 2305 50 2421
getivar-module 5 103 5 141 50 89 50 124
keyword_args 5 102 5 104 50 1240 50 1243
loops-times 5 23 5 25 50 63 50 61
object-new 5 267 5 475 50 296 50 1475
object-new-initialize 5 169 5 256 50 260 50 517
object-new-no-escape 5 80 5 140 50 89 50 363
respond_to 5 139 5 119 50 3900 50 3903
ruby-xor 5 247 5 237 50 1305 50 1299
send_bmethod 5 118 5 114 50 5539 50 4526
send_cfunc_block 5 106 5 104 50 304 50 289
send_rubyfunc_block 5 196 5 205 50 1372 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 297
setivar 5 359 5 348 50 4931 50 4925
setivar_object 5 341 5 272 50 762 50 721
setivar_young 5 341 5 272 50 809 50 712
str_concat 5 390 5 430 50 1201 50 1069
structaref 5 153 5 171 50 1798 50 1847
structaset 5 198 5 223 50 369 50 488
throw 5 1109 5 1317 50 1443 50 1655

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) 1564464 1348575 204 2687 0 0% 0 0 73.978355
chunky-png (click) 322716 315666 79 1372 1 0% 0 0 37.761093
erubi-rails (click) 1381743 1199009 268 3630 23 0% 0 0 93.596238
hexapdf (click) 1525301 1364021 594 15686 45 0% 0 0 423.669601
liquid-c (click) 559066 442875 114 2226 5 0% 0 0 58.418628
liquid-compile (click) 478319 439584 146 2679 2 0% 0 0 72.477235
liquid-il (click) 614755 584666 70 2718 0 0% 0 0 79.431221
liquid-render (click) 668037 610503 131 2945 8 0% 0 0 77.465058
lobsters (click) 8525998 7158722 3127 63027 125 0% 0 0 2002.433372
mail (click) 862571 849982 345 7654 40 0% 0 0 205.785875
psych-load (click) 286772 258549 60 820 2 0% 0 0 22.438489
railsbench (click) 3357921 2889221 1591 19740 105 0% 0 0 533.468147
rubocop (click) 5766402 5052219 3000 57037 132 0% 6 0 1633.911702
ruby-lsp (click) 1046115 925915 408 7425 47 0% 1 0 195.580909
sequel (click) 523040 465365 11 119 0 0% 0 0 4.185075
shipit (click) 6887542 5806940 3136 49924 147 0% 0 0 1614.259264
addressable-equality (click) 323931 285201 44 1381 1 0% 0 0 33.076414
addressable-getters (click) 284214 228099 26 863 0 0% 0 0 20.254353
addressable-join (click) 289706 228492 24 941 0 0% 0 0 23.238032
addressable-merge (click) 289732 247463 27 896 0 0% 0 0 21.518511
addressable-new (click) 264573 228563 21 563 0 0% 0 0 13.502151
addressable-normalize (click) 319289 280174 43 1327 1 0% 0 0 31.409488
addressable-parse (click) 286926 254545 26 880 0 0% 0 0 21.031844
addressable-setters (click) 264484 189651 20 582 0 0% 0 0 13.704194
addressable-to-s (click) 283822 202477 26 849 0 0% 0 0 20.00675
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.734651
blurhash (click) 52495 43786 27 607 0 0% 0 0 17.896525
erubi (click) 249993 225287 6 134 0 0% 0 0 3.846725
etanni (click) 33079 34728 8 114 0 0% 0 0 3.400621
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.805915
fluentd (click) 513900 436399 7 116 0 0% 0 0 3.642885
gcbench (click) 15893 8734 9 110 0 0% 0 0 3.493808
graphql (click) 415286 374230 74 1939 18 0% 0 0 52.35396
graphql-native (click) 358281 307099 39 532 0 0% 0 0 13.656446
knucleotide (click) 9961 2328 7 110 0 0% 0 0 4.707259
lee (click) 318962 289013 50 1101 0 0% 0 0 30.57236
matmul (click) 11103 4709 8 136 0 0% 0 0 4.127276
nbody (click) 14448 21176 6 251 0 0% 0 0 6.101914
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.169482
optcarrot (click) 321897 302848 188 4600 34 0% 0 0 106.634599
protoboeuf (click) 175400 243898 12 2904 0 0% 0 0 73.473707
protoboeuf-encode (click) 247853 316926 14 1820 0 0% 0 0 42.245433
rack (click) 285444 230347 35 581 0 0% 0 0 14.513009
ruby-json (click) 19849 17818 8 210 0 0% 0 0 5.711801
rubyboy (click) 690977 572118 154 6875 42 0% 0 0 163.276988
rubykon (click) 146721 137257 137 2078 3 0% 0 0 54.45227
splay (click) 34682 14303 9 175 0 0% 0 0 5.210728
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.698026
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.891143
tinygql (click) 302142 258717 59 1024 5 0% 0 0 26.124503
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1865.875612
30k_methods (click) 2278130 1643075 5780 19370 0 0% 0 0 474.579014
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.04988
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.483784
fib (click) 2659 2995 3 30 0 0% 0 0 1.114134
getivar (click) 3789 6778 3 79 0 0% 0 0 1.927706
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.299211
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.821932
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.867802
object-new (click) 2406 2818 2 36 0 0% 0 0 1.007556
object-new-initialize (click) 3156 3352 4 43 0 0% 0 0 1.274836
object-new-no-escape (click) 4285 4620 5 63 0 0% 0 0 1.718284
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.144543
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.869567
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.797773
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.290625
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.766802
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.064588
setivar (click) 2783 3726 3 46 0 0% 0 0 1.256504
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.397089
setivar_young (click) 4441 4926 4 63 0 0% 0 0 1.700958
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.484364
structaref (click) 4407 9095 3 88 0 0% 0 0 2.34032
structaset (click) 4113 5834 3 70 0 0% 0 0 1.785151
throw (click) 5953 4624 5 53 0 0% 0 0 1.781976

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.