Ruby Benchmarks

Details for Benchmarks at 2026-04-25 01:00:45 UTC

YJIT metrics from the ruby-bench suite using Ruby 49851c8770.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 101.4% faster than CRuby 4.1.0dev
  • 7.8% faster than YJIT 3.4.7
On railsbench it is
  • 118.6% faster than CRuby 4.1.0dev
  • 14.5% faster than YJIT 3.4.7
x86_64 runtime: 8 hours, 60 minutes
aarch64 runtime: 7 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.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 91 50 200 50 237
chunky-png 5 32 5 30 50 34 50 27
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 424 5 434 50 618 50 658
liquid-compile 5 419 5 476 50 582 50 741
liquid-render 5 173 5 171 50 433 50 458
lobsters 5 20 5 20 50 10 50 10
mail 5 193 5 198 50 253 50 287
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 152 50 245 50 249
ruby-lsp 5 163 5 162 50 239 50 232
sequel 5 420 5 445 50 583 50 628
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 27 50 12 50 12
addressable-getters 5 165 5 164 50 184 50 195
addressable-join 5 74 5 78 50 66 50 72
addressable-merge 5 161 5 151 50 223 50 218
addressable-new 5 353 5 338 50 519 50 517
addressable-normalize 5 52 5 53 50 60 50 59
addressable-parse 5 104 5 102 50 103 50 110
addressable-setters 5 185 5 177 50 233 50 235
addressable-to-s 5 165 5 164 50 181 50 194
binarytrees 5 81 5 85 50 136 50 144
blurhash 5 84 5 84 50 145 50 145
erubi 5 140 5 146 50 140 50 145
etanni 5 101 5 77 50 71 50 44
fannkuchredux 5 55 5 56 50 101 50 104
fluentd 5 56 5 58 50 21 50 27
gcbench 5 10 5 10 50 10 50 15
graphql 5 373 5 423 50 570 50 947
graphql-native 5 57 5 88 50 23 50 70
knucleotide 5 163 5 144 50 117 50 98
lee 5 23 5 29 50 10 50 12
matmul 5 53 5 56 50 88 50 98
nbody 5 249 5 275 50 663 50 706
nqueens 5 119 5 122 50 554 50 579
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 183 50 697 50 788
protoboeuf-encode 5 201 5 194 50 800 50 834
rack 5 440 5 442 50 718 50 721
ruby-json 5 84 5 104 50 50 50 84
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 225 50 250 50 282
sudoku 5 48 5 49 50 154 50 158
tinygql 5 41 5 40 50 40 50 51
30k_ifelse 5 28 5 28 50 173 50 184
30k_methods 5 39 5 39 50 453 50 459
attr_accessor 5 157 5 177 50 1833 50 1884
cfunc_itself 5 346 5 326 50 1255 50 1259
fib 5 124 5 134 50 939 50 939
getivar 5 215 5 297 50 2304 50 2406
getivar-module 5 103 5 136 50 89 50 267
keyword_args 5 102 5 100 50 1240 50 1243
loops-times 5 23 5 25 50 63 50 62
object-new 5 268 5 471 50 298 50 1513
object-new-initialize 5 169 5 252 50 259 50 1021
object-new-no-escape 5 81 5 134 50 89 50 516
respond_to 5 139 5 131 50 3906 50 3901
ruby-xor 5 247 5 233 50 1305 50 1294
send_bmethod 5 118 5 116 50 5539 50 4526
send_cfunc_block 5 106 5 107 50 305 50 330
send_rubyfunc_block 5 195 5 203 50 1372 50 1376
setivar 5 359 5 479 50 4929 50 5041
setivar_object 5 341 5 347 50 758 50 653
setivar_young 5 342 5 346 50 810 50 692
str_concat 5 392 5 386 50 1200 50 1174
structaref 5 153 5 174 50 1800 50 1847
structaset 5 198 5 202 50 368 50 470
throw 5 1109 5 1404 50 1442 50 1889

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) 1553502 1328763 203 2669 0 0% 0 0 73.712312
chunky-png (click) 325097 307262 79 1376 1 0% 0 0 37.910624
erubi-rails (click) 1384388 1228363 268 3626 23 0% 0 0 99.21675
hexapdf (click) 1535354 1379424 594 15782 44 0% 0 0 427.256246
liquid-c (click) 563295 514691 114 2240 5 0% 0 0 58.458184
liquid-compile (click) 486440 451344 146 2733 2 0% 0 0 81.280816
liquid-render (click) 663110 621002 131 2963 8 0% 0 0 77.517592
lobsters (click) 8589913 7384793 3126 63784 122 0% 0 0 2041.281209
mail (click) 873108 847132 345 7738 40 0% 0 0 207.922701
psych-load (click) 292463 235940 61 829 2 0% 0 0 23.644558
railsbench (click) 3359714 2850929 1592 19761 104 0% 0 0 532.652358
rubocop (click) 5789769 5019660 3002 57204 127 0% 6 0 1639.169016
ruby-lsp (click) 1047210 908770 409 7472 47 0% 1 0 199.251774
sequel (click) 504731 447318 11 121 0 0% 0 0 5.816589
shipit (click) 7394577 6131611 3161 51752 155 0% 0 0 1650.471902
addressable-equality (click) 312575 260432 44 1387 1 0% 0 0 35.330521
addressable-getters (click) 282294 248492 26 869 0 0% 0 0 21.277885
addressable-join (click) 287506 240390 24 945 0 0% 0 0 25.4074
addressable-merge (click) 287494 259359 27 900 0 0% 0 0 24.69842
addressable-new (click) 261324 230889 21 569 0 0% 0 0 14.098323
addressable-normalize (click) 316840 291825 43 1327 1 0% 0 0 34.168988
addressable-parse (click) 285005 242170 26 886 0 0% 0 0 23.093573
addressable-setters (click) 262194 250590 20 582 0 0% 0 0 15.792046
addressable-to-s (click) 281740 247235 26 853 0 0% 0 0 22.215032
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.740088
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.970213
erubi (click) 251950 200403 6 134 0 0% 0 0 3.880491
etanni (click) 32989 26478 8 114 0 0% 0 0 3.392424
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.808238
fluentd (click) 488372 467355 7 116 0 0% 0 0 3.562927
gcbench (click) 15808 8981 9 110 0 0% 0 0 3.58194
graphql (click) 405462 357533 73 1931 19 0% 0 0 52.168074
graphql-native (click) 355018 323399 39 532 0 0% 0 0 13.774727
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.69116
lee (click) 321778 272972 49 1099 0 0% 0 0 30.248502
matmul (click) 11103 4709 8 136 0 0% 0 0 4.095296
nbody (click) 14448 21176 6 251 0 0% 0 0 6.084101
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.173019
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 106.655757
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.504431
protoboeuf-encode (click) 243323 242439 14 1820 0 0% 0 0 43.093673
rack (click) 288021 222323 35 586 0 0% 0 0 16.267104
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.63656
rubyboy (click) 708976 666783 154 6873 42 0% 0 0 163.256138
rubykon (click) 148777 155950 138 2107 4 0% 0 0 55.086296
splay (click) 34953 22682 9 175 0 0% 0 0 5.188608
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.732594
tinygql (click) 301660 279128 59 1032 5 0% 0 0 26.401079
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1860.367841
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 471.358159
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.095145
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.512373
fib (click) 2659 2995 3 30 0 0% 0 0 1.078058
getivar (click) 3789 6778 3 79 0 0% 0 0 1.930023
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.326564
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.833187
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.894504
object-new (click) 2406 2818 2 36 0 0% 0 0 0.994555
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.291573
object-new-no-escape (click) 4540 5102 5 68 0 0% 0 0 1.958564
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.127304
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.774955
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.81094
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.283964
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.743373
setivar (click) 2783 3726 3 46 0 0% 0 0 1.238041
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.39467
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.693473
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.424133
structaref (click) 4407 9095 3 88 0 0% 0 0 2.327393
structaset (click) 4113 5834 3 70 0 0% 0 0 1.797165
throw (click) 5953 4624 5 53 0 0% 0 0 1.780333

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.