Ruby Benchmarks

Details for Benchmarks at 2026-04-16 01:05:54 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 100.0% faster than CRuby 4.1.0dev
  • 8.8% faster than YJIT 3.4.7
On railsbench it is
  • 118.8% 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, 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 94 50 202 50 242
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 422 5 437 50 616 50 660
liquid-compile 5 420 5 480 50 553 50 743
liquid-render 5 172 5 169 50 429 50 455
lobsters 5 20 5 20 50 10 50 10
mail 5 193 5 199 50 253 50 286
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 153 50 246 50 243
ruby-lsp 5 162 5 161 50 230 50 237
sequel 5 421 5 454 50 586 50 634
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 27 50 12 50 12
addressable-getters 5 165 5 167 50 183 50 197
addressable-join 5 75 5 79 50 66 50 72
addressable-merge 5 161 5 152 50 223 50 219
addressable-new 5 352 5 340 50 520 50 525
addressable-normalize 5 53 5 53 50 60 50 59
addressable-parse 5 104 5 103 50 104 50 109
addressable-setters 5 185 5 175 50 233 50 233
addressable-to-s 5 163 5 165 50 182 50 194
binarytrees 5 82 5 85 50 136 50 143
blurhash 5 84 5 83 50 145 50 145
erubi 5 140 5 154 50 125 50 157
etanni 5 100 5 81 50 72 50 46
fannkuchredux 5 55 5 56 50 101 50 104
fluentd 5 55 5 61 50 21 50 26
gcbench 5 10 5 10 50 10 50 15
graphql 5 373 5 451 50 573 50 924
graphql-native 5 57 5 87 50 21 50 70
knucleotide 5 163 5 146 50 118 50 100
lee 5 23 5 29 50 10 50 15
matmul 5 53 5 56 50 88 50 94
nbody 5 250 5 281 50 663 50 705
nqueens 5 117 5 118 50 554 50 579
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 180 50 697 50 785
protoboeuf-encode 5 201 5 195 50 808 50 817
rack 5 441 5 451 50 711 50 723
ruby-json 5 84 5 105 50 50 50 81
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 208 5 223 50 250 50 284
sudoku 5 48 5 49 50 155 50 159
tinygql 5 42 5 42 50 40 50 53
30k_ifelse 5 28 5 28 50 186 50 185
30k_methods 5 38 5 39 50 456 50 453
attr_accessor 5 157 5 179 50 1832 50 1887
cfunc_itself 5 347 5 323 50 1255 50 1259
fib 5 125 5 134 50 939 50 938
getivar 5 212 5 302 50 2313 50 2413
getivar-module 5 103 5 137 50 89 50 268
keyword_args 5 102 5 102 50 1240 50 1242
loops-times 5 23 5 25 50 63 50 63
object-new 5 268 5 472 50 296 50 1513
object-new-initialize 5 168 5 254 50 260 50 1019
object-new-no-escape 5 81 5 133 50 89 50 515
respond_to 5 139 5 130 50 3898 50 3901
ruby-xor 5 247 5 235 50 1305 50 1310
send_bmethod 5 118 5 115 50 5538 50 4525
send_cfunc_block 5 106 5 107 50 303 50 276
send_rubyfunc_block 5 196 5 210 50 1371 50 1375
setivar 5 359 5 471 50 4930 50 5038
setivar_object 5 341 5 349 50 762 50 670
setivar_young 5 342 5 349 50 807 50 688
str_concat 5 390 5 446 50 1201 50 1169
structaref 5 153 5 187 50 1803 50 1863
structaset 5 198 5 203 50 370 50 468
throw 5 1109 5 1385 50 1439 50 1776

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) 1560588 1322074 203 2657 0 0% 0 0 72.958647
chunky-png (click) 325097 307262 79 1376 1 0% 0 0 37.967829
erubi-rails (click) 1383028 1251441 268 3626 23 0% 0 0 99.223353
hexapdf (click) 1536683 1372741 593 15797 44 0% 0 0 429.662827
liquid-c (click) 566244 428125 114 2242 5 0% 0 0 59.441501
liquid-compile (click) 489090 438304 146 2770 2 0% 0 0 81.58079
liquid-render (click) 672279 633085 131 2963 8 0% 0 0 77.339591
lobsters (click) 8592602 7319738 3127 63826 122 0% 0 0 2037.361074
mail (click) 873197 838622 345 7738 40 0% 0 0 208.149256
psych-load (click) 292898 252665 61 833 2 0% 0 0 23.49694
railsbench (click) 3361859 2811642 1592 19799 104 0% 0 0 534.592042
rubocop (click) 5780867 5016356 3002 57198 128 0% 6 0 1613.10031
ruby-lsp (click) 1047210 900402 409 7472 47 0% 1 0 199.741731
sequel (click) 504484 446727 11 121 0 0% 0 0 4.929203
shipit (click) 7303307 6167266 3118 50446 148 0% 0 0 1597.425755
addressable-equality (click) 321431 272212 44 1380 1 0% 0 0 36.653625
addressable-getters (click) 282294 248492 26 869 0 0% 0 0 20.989576
addressable-join (click) 287506 240390 24 945 0 0% 0 0 27.674025
addressable-merge (click) 284296 238870 27 900 0 0% 0 0 24.282352
addressable-new (click) 262529 248859 21 569 0 0% 0 0 14.469543
addressable-normalize (click) 316840 291825 43 1327 1 0% 0 0 33.713916
addressable-parse (click) 275089 237528 26 880 0 0% 0 0 23.663112
addressable-setters (click) 262355 250801 20 584 0 0% 0 0 15.942819
addressable-to-s (click) 281740 247235 26 853 0 0% 0 0 22.172974
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.752271
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.887701
erubi (click) 248686 204452 6 134 0 0% 0 0 3.927547
etanni (click) 32752 34339 8 114 0 0% 0 0 3.43728
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.853724
fluentd (click) 488698 451331 7 116 0 0% 0 0 3.613463
gcbench (click) 15808 8981 9 110 0 0% 0 0 3.663407
graphql (click) 414863 369827 73 1931 19 0% 0 0 52.443366
graphql-native (click) 358270 335438 39 532 0 0% 0 0 13.737181
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.703618
lee (click) 321778 272972 49 1099 0 0% 0 0 30.235285
matmul (click) 11103 4709 8 136 0 0% 0 0 4.113923
nbody (click) 14448 21176 6 251 0 0% 0 0 6.156194
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.193423
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 106.632378
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.990227
protoboeuf-encode (click) 243323 242439 14 1820 0 0% 0 0 43.236183
rack (click) 287708 271231 35 581 0 0% 0 0 15.803108
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.733587
rubyboy (click) 708976 666783 154 6873 42 0% 0 0 162.921621
rubykon (click) 148271 147165 138 2099 4 0% 0 0 55.014375
splay (click) 34953 22682 9 175 0 0% 0 0 5.178533
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.757328
tinygql (click) 301704 254329 59 1032 5 0% 0 0 26.431768
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1857.174164
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 474.024078
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.110723
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.526105
fib (click) 2659 2995 3 30 0 0% 0 0 1.12245
getivar (click) 3789 6778 3 79 0 0% 0 0 1.921956
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.32366
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.810331
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.953873
object-new (click) 2406 2818 2 36 0 0% 0 0 0.978423
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.281613
object-new-no-escape (click) 4540 5102 5 68 0 0% 0 0 1.998929
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.15945
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.795645
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.840863
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.307501
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.802216
setivar (click) 2783 3726 3 46 0 0% 0 0 1.278932
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.423945
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.688363
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.457446
structaref (click) 4407 9095 3 88 0 0% 0 0 2.344853
structaset (click) 4113 5834 3 70 0 0% 0 0 1.834199
throw (click) 5953 4624 5 53 0 0% 0 0 1.77719

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.