Ruby Benchmarks

Details for Benchmarks at 2026-06-30 01:20:22 UTC

YJIT metrics from the ruby-bench suite using Ruby 07abf0b039.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 100.4% faster than CRuby 4.1.0dev
  • 10.0% faster than YJIT 3.4.7
On railsbench it is
  • 115.7% faster than CRuby 4.1.0dev
  • 14.7% 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 90 5 95 50 194 50 228
chunky-png 5 31 5 30 50 34 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 440 50 617 50 682
liquid-compile 5 419 5 513 50 580 50 855
liquid-render 5 171 5 171 50 431 50 472
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 206 50 254 50 303
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 155 5 155 50 247 50 246
ruby-lsp 5 154 5 157 50 225 50 228
sequel 5 427 5 460 50 587 50 669
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 18
addressable-getters 5 164 5 169 50 183 50 209
addressable-join 5 74 5 82 50 66 50 83
addressable-merge 5 161 5 157 50 223 50 243
addressable-new 5 351 5 348 50 519 50 542
addressable-normalize 5 53 5 57 50 59 50 70
addressable-parse 5 104 5 104 50 103 50 118
addressable-setters 5 184 5 185 50 233 50 253
addressable-to-s 5 164 5 169 50 181 50 208
binarytrees 5 82 5 87 50 136 50 144
blurhash 5 84 5 84 50 145 50 145
erubi 5 138 5 147 50 137 50 153
etanni 5 99 5 81 50 72 50 48
fannkuchredux 5 55 5 58 50 101 50 107
fluentd 5 62 5 66 50 21 50 26
gcbench 5 10 5 10 50 10 50 16
graphql 5 373 5 472 50 570 50 967
graphql-native 5 57 5 89 50 23 50 70
knucleotide 5 162 5 147 50 118 50 100
lee 5 23 5 29 50 10 50 16
matmul 5 53 5 53 50 87 50 94
nbody 5 250 5 240 50 663 50 647
nqueens 5 119 5 129 50 554 50 574
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 183 50 697 50 795
protoboeuf-encode 5 200 5 189 50 804 50 815
rack 5 435 5 466 50 709 50 797
ruby-json 5 84 5 113 50 50 50 92
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 204 50 250 50 238
sudoku 5 48 5 50 50 155 50 157
tinygql 5 41 5 44 50 40 50 55
30k_ifelse 5 28 5 28 50 185 50 185
30k_methods 5 38 5 39 50 447 50 455
attr_accessor 5 156 5 180 50 1832 50 1883
cfunc_itself 5 346 5 314 50 1255 50 1258
fib 5 124 5 138 50 939 50 939
getivar 5 215 5 336 50 2313 50 2437
getivar-module 5 103 5 137 50 89 50 283
keyword_args 5 102 5 104 50 1240 50 1245
loops-times 5 23 5 26 50 63 50 60
object-new 5 268 5 476 50 296 50 1445
object-new-initialize 5 168 5 236 50 259 50 989
object-new-no-escape 5 80 5 138 50 89 50 506
respond_to 5 139 5 120 50 3901 50 3904
ruby-xor 5 246 5 228 50 1305 50 1310
send_bmethod 5 118 5 109 50 5539 50 4526
send_cfunc_block 5 107 5 103 50 300 50 290
send_rubyfunc_block 5 196 5 194 50 1372 50 1375
setivar 5 359 5 382 50 4930 50 4963
setivar_object 5 341 5 296 50 760 50 598
setivar_young 5 345 5 297 50 808 50 609
str_concat 5 390 5 427 50 1200 50 1050
structaref 5 153 5 184 50 1798 50 1867
structaset 5 197 5 217 50 370 50 490
throw 5 1109 5 1373 50 1443 50 1732

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) 1564690 1271610 203 2659 0 0% 0 0 74.680365
chunky-png (click) 325946 292438 79 1376 1 0% 0 0 38.750461
erubi-rails (click) 1388030 1160280 268 3626 23 0% 0 0 95.050119
hexapdf (click) 1535244 1298528 593 15767 44 0% 0 0 426.906818
liquid-c (click) 558874 492974 114 2240 5 0% 0 0 58.803843
liquid-compile (click) 473821 428304 146 2669 2 0% 0 0 74.606757
liquid-render (click) 674595 669573 131 2963 8 0% 0 0 77.66386
lobsters (click) 8570756 7086259 3123 63507 122 0% 0 0 2032.375457
mail (click) 865664 822540 345 7739 40 0% 0 0 209.007279
psych-load (click) 293257 245644 61 829 2 0% 0 0 23.558952
railsbench (click) 3360847 2897390 1592 19741 105 0% 0 0 535.283913
rubocop (click) 5806126 5042602 3002 57352 127 0% 6 0 1730.974962
ruby-lsp (click) 1050997 922936 409 7470 47 0% 1 0 199.590145
sequel (click) 511960 431819 11 119 0 0% 0 0 4.167451
shipit (click) 6944677 5931856 3130 50079 147 0% 0 0 1598.139952
addressable-equality (click) 326002 294011 44 1381 1 0% 0 0 33.340482
addressable-getters (click) 286285 253293 26 863 0 0% 0 0 20.509704
addressable-join (click) 291779 237302 24 941 0 0% 0 0 23.465734
addressable-merge (click) 291803 248047 27 896 0 0% 0 0 21.465191
addressable-new (click) 266639 229176 21 563 0 0% 0 0 13.671701
addressable-normalize (click) 320112 270643 43 1327 1 0% 0 0 31.844448
addressable-parse (click) 288997 263355 26 880 0 0% 0 0 21.00099
addressable-setters (click) 266829 247836 20 582 0 0% 0 0 14.130138
addressable-to-s (click) 285888 260434 26 849 0 0% 0 0 20.14135
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.768218
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.83502
erubi (click) 249636 222478 6 134 0 0% 0 0 3.909292
etanni (click) 32989 26478 8 114 0 0% 0 0 3.450989
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.889609
fluentd (click) 517903 454234 7 116 0 0% 0 0 3.604229
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.365473
graphql (click) 399889 344053 74 1940 18 0% 0 0 52.801916
graphql-native (click) 362125 299651 39 532 0 0% 0 0 13.56085
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.743408
lee (click) 322939 299824 50 1102 0 0% 0 0 30.603574
matmul (click) 11103 4709 8 136 0 0% 0 0 4.118469
nbody (click) 14448 21176 6 251 0 0% 0 0 6.09696
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.257004
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 106.230889
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 73.019385
protoboeuf-encode (click) 242245 233890 14 1820 0 0% 0 0 42.991176
rack (click) 289104 240940 35 581 0 0% 0 0 14.615822
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.919278
rubyboy (click) 709070 610109 154 6871 42 0% 0 0 163.72422
rubykon (click) 147788 154811 138 2094 4 0% 0 0 54.899308
splay (click) 34617 22483 9 175 0 0% 0 0 5.33611
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.978636
tinygql (click) 305123 267690 59 1026 5 0% 0 0 26.421209
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1868.018246
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 475.912841
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.080487
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.507885
fib (click) 2659 2995 3 30 0 0% 0 0 1.096111
getivar (click) 3789 6778 3 79 0 0% 0 0 1.90737
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.340334
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.771609
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.913369
object-new (click) 2406 2818 2 36 0 0% 0 0 0.999227
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.295125
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.744677
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.1406
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.806298
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.818917
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.301909
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.729967
setivar (click) 2783 3726 3 46 0 0% 0 0 1.246986
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.418734
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.719663
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.511214
structaref (click) 4407 9095 3 88 0 0% 0 0 2.315368
structaset (click) 4113 5834 3 70 0 0% 0 0 1.759299
throw (click) 5953 4624 5 53 0 0% 0 0 1.744962

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.