Ruby Benchmarks

Details for Benchmarks at 2026-07-28 00:52:06 UTC

YJIT metrics from the ruby-bench suite using Ruby 5cf431492c.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 94.7% faster than CRuby 4.1.0dev
  • 5.1% faster than YJIT 3.4.7
On railsbench it is
  • 112.6% faster than CRuby 4.1.0dev
  • 9.3% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 10 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 97 50 196 50 203
chunky-png 5 32 5 30 50 33 50 24
erubi-rails 5 15 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 423 5 442 50 620 50 671
liquid-compile 5 420 5 517 50 584 50 829
liquid-il 5 67 5 68 50 117 50 125
liquid-render 5 169 5 174 50 431 50 462
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 208 50 254 50 288
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 238
ruby-lsp 5 158 5 157 50 225 50 224
sequel 5 418 5 460 50 590 50 663
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 17
addressable-getters 5 165 5 172 50 183 50 207
addressable-join 5 75 5 85 50 66 50 80
addressable-merge 5 161 5 160 50 221 50 231
addressable-new 5 351 5 347 50 519 50 517
addressable-normalize 5 53 5 57 50 61 50 69
addressable-parse 5 104 5 107 50 104 50 116
addressable-setters 5 185 5 188 50 234 50 253
addressable-to-s 5 164 5 172 50 181 50 206
binarytrees 5 82 5 88 50 136 50 169
blurhash 5 84 5 84 50 145 50 145
erubi 5 141 5 153 50 124 50 161
etanni 5 101 5 83 50 72 50 51
fannkuchredux 5 55 5 57 50 100 50 108
fluentd 5 61 5 59 50 20 50 27
gcbench 5 10 5 10 50 10 50 10
graphql 5 373 5 466 50 570 50 898
graphql-native 5 57 5 86 50 22 50 58
knucleotide 5 163 5 151 50 117 50 105
lee 5 23 5 31 50 10 50 19
matmul 5 53 5 53 50 88 50 96
nbody 5 250 5 249 50 663 50 683
nqueens 5 119 5 126 50 555 50 598
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 180 50 697 50 685
protoboeuf-encode 5 201 5 195 50 804 50 807
rack 5 434 5 466 50 717 50 742
ruby-json 5 84 5 115 50 50 50 93
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 21 50 10 50 10
splay 5 209 5 235 50 250 50 240
string_malloc_pressure 5 146 5 34 50 101 50 10
sudoku 5 48 5 49 50 155 50 166
tinygql 5 42 5 44 50 39 50 51
30k_ifelse 5 28 5 28 50 185 50 184
30k_methods 5 38 5 39 50 456 50 455
attr_accessor 5 156 5 173 50 1831 50 1873
cfunc_itself 5 348 5 345 50 1255 50 1258
fib 5 124 5 136 50 939 50 939
getivar 5 210 5 321 50 2306 50 2434
getivar-module 5 103 5 144 50 89 50 117
keyword_args 5 102 5 93 50 1240 50 1242
loops-times 5 23 5 26 50 63 50 61
object-new 5 268 5 474 50 298 50 1487
object-new-initialize 5 168 5 256 50 260 50 516
object-new-no-escape 5 80 5 141 50 89 50 363
respond_to 5 139 5 121 50 3906 50 3898
ruby-xor 5 247 5 241 50 1305 50 1299
send_bmethod 5 118 5 118 50 5539 50 4526
send_cfunc_block 5 107 5 104 50 307 50 294
send_rubyfunc_block 5 196 5 203 50 1372 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 297
setivar 5 359 5 348 50 4930 50 4923
setivar_object 5 341 5 272 50 762 50 711
setivar_young 5 341 5 271 50 809 50 731
str_concat 5 391 5 442 50 1201 50 1066
structaref 5 153 5 193 50 1800 50 1882
structaset 5 197 5 239 50 367 50 493
throw 5 1108 5 1333 50 1443 50 1685

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) 1563590 1372019 204 2672 0 0% 0 0 73.164904
chunky-png (click) 319836 287262 79 1372 1 0% 0 0 39.287129
erubi-rails (click) 1381728 1182725 268 3630 23 0% 0 0 93.500283
hexapdf (click) 1521264 1318308 593 15681 45 0% 0 0 428.496861
liquid-c (click) 558772 499991 114 2226 5 0% 0 0 57.89852
liquid-compile (click) 475444 386644 146 2679 2 0% 0 0 71.974904
liquid-il (click) 614339 584523 70 2715 0 0% 0 0 79.03227
liquid-render (click) 668022 602311 131 2945 8 0% 0 0 77.265913
lobsters (click) 8523128 7220784 3128 62998 125 0% 0 0 2023.396111
mail (click) 866096 805554 345 7654 40 0% 0 0 205.594113
psych-load (click) 283892 246544 60 820 2 0% 0 0 22.69023
railsbench (click) 3359094 2858477 1591 19736 105 0% 0 0 564.866386
rubocop (click) 5765090 4944432 3000 57018 133 0% 6 0 1716.588974
ruby-lsp (click) 1045262 957223 408 7425 47 0% 1 0 197.03348
sequel (click) 522812 481599 11 119 0 0% 0 0 3.772873
shipit (click) 6886902 5838077 3135 49911 147 0% 0 0 1583.870907
addressable-equality (click) 323916 293393 44 1381 1 0% 0 0 33.203958
addressable-getters (click) 284199 236291 26 863 0 0% 0 0 20.406227
addressable-join (click) 289691 228492 24 941 0 0% 0 0 23.060668
addressable-merge (click) 289717 255655 27 896 0 0% 0 0 21.284297
addressable-new (click) 264555 212174 21 563 0 0% 0 0 13.280771
addressable-normalize (click) 319274 263790 43 1327 1 0% 0 0 31.762878
addressable-parse (click) 286632 221549 26 880 0 0% 0 0 21.007607
addressable-setters (click) 264750 198071 20 582 0 0% 0 0 13.881221
addressable-to-s (click) 283807 210669 26 849 0 0% 0 0 19.941586
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.756274
blurhash (click) 52495 43786 27 607 0 0% 0 0 17.842847
erubi (click) 249978 225287 6 134 0 0% 0 0 3.820086
etanni (click) 33079 34728 8 114 0 0% 0 0 3.44415
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.787602
fluentd (click) 513951 452841 7 116 0 0% 0 0 3.607127
gcbench (click) 15893 8734 9 110 0 0% 0 0 3.479462
graphql (click) 415550 366266 74 1939 18 0% 0 0 52.370202
graphql-native (click) 358633 340224 39 532 0 0% 0 0 13.511701
knucleotide (click) 9961 2328 7 110 0 0% 0 0 4.745254
lee (click) 319226 289261 50 1101 0 0% 0 0 30.182008
matmul (click) 11103 4709 8 136 0 0% 0 0 4.148912
nbody (click) 14448 21176 6 251 0 0% 0 0 6.132015
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.240105
optcarrot (click) 321859 302768 188 4597 34 0% 0 0 106.486288
protoboeuf (click) 175400 243898 12 2904 0 0% 0 0 74.397492
protoboeuf-encode (click) 247853 316926 14 1820 0 0% 0 0 42.397252
rack (click) 285429 230347 35 581 0 0% 0 0 14.518496
ruby-json (click) 19789 17789 8 206 0 0% 0 0 5.683898
rubyboy (click) 709630 610942 154 6871 42 0% 0 0 162.829972
rubykon (click) 146721 137257 137 2078 3 0% 0 0 54.599452
splay (click) 34682 14303 9 175 0 0% 0 0 5.371867
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.729467
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.772972
tinygql (click) 302127 266929 59 1024 5 0% 0 0 26.193167
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1864.385949
30k_methods (click) 2278130 1643075 5780 19370 0 0% 0 0 472.145836
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.09633
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.479598
fib (click) 2659 2995 3 30 0 0% 0 0 1.106874
getivar (click) 3789 6778 3 79 0 0% 0 0 1.911638
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.281104
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.790324
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.859208
object-new (click) 2406 2818 2 36 0 0% 0 0 0.997627
object-new-initialize (click) 3156 3352 4 43 0 0% 0 0 1.300007
object-new-no-escape (click) 4285 4620 5 63 0 0% 0 0 1.728796
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.164241
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.780344
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.772198
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.280698
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.733304
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.05193
setivar (click) 2783 3726 3 46 0 0% 0 0 1.238832
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.402113
setivar_young (click) 4441 4926 4 63 0 0% 0 0 1.718839
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.462813
structaref (click) 4407 9095 3 88 0 0% 0 0 2.315549
structaset (click) 4113 5834 3 70 0 0% 0 0 1.76581
throw (click) 5953 4624 5 53 0 0% 0 0 1.757049

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.