Ruby Benchmarks

Details for Benchmarks at 2026-07-04 01:00:31 UTC

YJIT metrics from the ruby-bench suite using Ruby e70011179e.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 100.5% faster than CRuby 4.1.0dev
  • 9.4% faster than YJIT 3.4.7
On railsbench it is
  • 122.1% faster than CRuby 4.1.0dev
  • 17.4% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 1 minutes
aarch64 runtime: 7 hours, 51 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 91 5 93 50 197 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 420 5 438 50 616 50 679
liquid-compile 5 420 5 512 50 664 50 838
liquid-render 5 170 5 172 50 430 50 462
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 208 50 253 50 304
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 246 50 255
ruby-lsp 5 163 5 161 50 237 50 227
sequel 5 426 5 471 50 596 50 667
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 29 50 12 50 18
addressable-getters 5 165 5 170 50 183 50 210
addressable-join 5 75 5 83 50 66 50 80
addressable-merge 5 161 5 159 50 222 50 241
addressable-new 5 350 5 340 50 520 50 535
addressable-normalize 5 52 5 58 50 60 50 70
addressable-parse 5 104 5 105 50 103 50 118
addressable-setters 5 185 5 184 50 234 50 254
addressable-to-s 5 165 5 171 50 182 50 206
binarytrees 5 81 5 86 50 136 50 145
blurhash 5 84 5 85 50 145 50 145
erubi 5 140 5 149 50 128 50 154
etanni 5 100 5 79 50 72 50 48
fannkuchredux 5 55 5 57 50 100 50 103
fluentd 5 62 5 59 50 20 50 28
gcbench 5 10 5 10 50 10 50 16
graphql 5 367 5 456 50 569 50 954
graphql-native 5 57 5 88 50 21 50 71
knucleotide 5 163 5 142 50 117 50 96
lee 5 23 5 30 50 10 50 17
matmul 5 53 5 53 50 87 50 92
nbody 5 249 5 243 50 662 50 643
nqueens 5 119 5 125 50 554 50 575
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 184 50 697 50 800
protoboeuf-encode 5 201 5 198 50 800 50 777
rack 5 448 5 466 50 705 50 792
ruby-json 5 84 5 114 50 50 50 93
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 208 5 204 50 250 50 242
sudoku 5 48 5 50 50 155 50 156
tinygql 5 41 5 44 50 40 50 54
30k_ifelse 5 28 5 28 50 184 50 184
30k_methods 5 38 5 39 50 447 50 457
attr_accessor 5 157 5 187 50 1833 50 1896
cfunc_itself 5 347 5 311 50 1255 50 1258
fib 5 125 5 137 50 939 50 939
getivar 5 210 5 338 50 2314 50 2442
getivar-module 5 100 5 139 50 89 50 285
keyword_args 5 102 5 101 50 1240 50 1245
loops-times 5 23 5 25 50 63 50 57
object-new 5 268 5 477 50 297 50 1446
object-new-initialize 5 169 5 234 50 259 50 981
object-new-no-escape 5 81 5 138 50 89 50 476
respond_to 5 139 5 120 50 3900 50 3900
ruby-xor 5 247 5 242 50 1305 50 1310
send_bmethod 5 118 5 108 50 5539 50 4526
send_cfunc_block 5 107 5 103 50 305 50 312
send_rubyfunc_block 5 196 5 198 50 1372 50 1375
setivar 5 359 5 378 50 4930 50 4958
setivar_object 5 341 5 305 50 762 50 661
setivar_young 5 341 5 305 50 809 50 687
str_concat 5 390 5 430 50 1203 50 1055
structaref 5 153 5 186 50 1797 50 1875
structaset 5 198 5 211 50 369 50 483
throw 5 1110 5 1329 50 1444 50 1720

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) 1561634 1423161 204 2667 0 0% 0 0 74.940983
chunky-png (click) 325946 292438 79 1376 1 0% 0 0 37.876798
erubi-rails (click) 1384233 1188350 268 3626 23 0% 0 0 99.750046
hexapdf (click) 1534290 1354236 593 15767 44 0% 0 0 425.765355
liquid-c (click) 564162 467649 114 2240 5 0% 0 0 59.00282
liquid-compile (click) 482227 430843 146 2673 2 0% 0 0 73.762469
liquid-render (click) 672274 617665 131 2963 8 0% 0 0 77.612263
lobsters (click) 8555547 7262252 3124 63512 122 0% 0 0 2048.226362
mail (click) 876141 811140 345 7739 40 0% 0 0 207.952153
psych-load (click) 288762 216156 60 829 2 0% 0 0 23.354007
railsbench (click) 3360631 2880931 1592 19742 105 0% 0 0 541.423913
rubocop (click) 5805113 5041086 3001 57361 129 0% 6 0 1650.663069
ruby-lsp (click) 1052673 957446 409 7470 47 0% 1 0 199.638498
sequel (click) 510107 429637 11 119 0 0% 0 0 4.415242
shipit (click) 6858535 5892308 3135 49971 147 0% 0 0 1592.455413
addressable-equality (click) 306750 254550 44 1381 1 0% 0 0 33.098152
addressable-getters (click) 286285 253293 26 863 0 0% 0 0 20.405053
addressable-join (click) 291779 237302 24 941 0 0% 0 0 22.881444
addressable-merge (click) 290281 254079 27 896 0 0% 0 0 21.633848
addressable-new (click) 265112 218819 21 563 0 0% 0 0 13.513267
addressable-normalize (click) 321355 280787 43 1327 1 0% 0 0 31.675516
addressable-parse (click) 284936 258471 26 880 0 0% 0 0 20.731466
addressable-setters (click) 266829 247836 20 582 0 0% 0 0 14.131217
addressable-to-s (click) 285888 260434 26 849 0 0% 0 0 20.143981
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.764234
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.636422
erubi (click) 251546 232774 6 134 0 0% 0 0 3.848277
etanni (click) 32752 34339 8 114 0 0% 0 0 3.441009
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.737544
fluentd (click) 517903 478878 7 116 0 0% 0 0 3.604014
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.380698
graphql (click) 417904 356999 74 1940 19 0% 0 0 53.234646
graphql-native (click) 362125 299651 39 532 0 0% 0 0 13.541158
knucleotide (click) 9939 10477 7 110 0 0% 0 0 6.797722
lee (click) 318547 286491 50 1102 0 0% 0 0 30.230112
matmul (click) 11103 4709 8 136 0 0% 0 0 4.099622
nbody (click) 14448 21176 6 251 0 0% 0 0 6.167149
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.207744
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 105.753827
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.51977
protoboeuf-encode (click) 242245 233890 14 1820 0 0% 0 0 42.903192
rack (click) 289104 240940 35 581 0 0% 0 0 14.611466
ruby-json (click) 19462 17420 8 206 0 0% 0 0 5.866547
rubyboy (click) 704730 596850 154 6871 42 0% 0 0 162.387083
rubykon (click) 147788 154811 138 2094 4 0% 0 0 54.86012
splay (click) 34617 22483 9 175 0 0% 0 0 5.360525
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.807232
tinygql (click) 305123 267690 59 1026 5 0% 0 0 26.532441
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1871.125016
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 478.358057
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.114789
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.52625
fib (click) 2659 2995 3 30 0 0% 0 0 1.090142
getivar (click) 3789 6778 3 79 0 0% 0 0 1.910506
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.33763
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.818123
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.929674
object-new (click) 2406 2818 2 36 0 0% 0 0 0.980395
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.312248
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.765886
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.136618
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.788264
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.785535
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.258258
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.72974
setivar (click) 2783 3726 3 46 0 0% 0 0 1.270747
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.424862
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.708721
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.466001
structaref (click) 4407 9095 3 88 0 0% 0 0 2.321768
structaset (click) 4113 5834 3 70 0 0% 0 0 1.800412
throw (click) 5953 4624 5 53 0 0% 0 0 1.733421

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.