Ruby Benchmarks

Details for Benchmarks at 2026-07-29 00:53:43 UTC

YJIT metrics from the ruby-bench suite using Ruby 2999c81ce2.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 97.5% faster than CRuby 4.1.0dev
  • 7.9% faster than YJIT 3.4.7
On railsbench it is
  • 114.2% faster than CRuby 4.1.0dev
  • 14.6% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 9 minutes
aarch64 runtime: 7 hours, 50 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 96 50 192 50 210
chunky-png 5 32 5 30 50 34 50 28
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 618 50 669
liquid-compile 5 421 5 513 50 545 50 830
liquid-il 5 67 5 68 50 117 50 125
liquid-render 5 167 5 174 50 412 50 461
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 209 50 254 50 292
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 240
ruby-lsp 5 156 5 158 50 238 50 228
sequel 5 427 5 463 50 574 50 660
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 29 50 12 50 17
addressable-getters 5 165 5 171 50 182 50 206
addressable-join 5 75 5 84 50 66 50 79
addressable-merge 5 161 5 158 50 223 50 228
addressable-new 5 352 5 343 50 521 50 507
addressable-normalize 5 53 5 58 50 60 50 68
addressable-parse 5 104 5 107 50 104 50 115
addressable-setters 5 185 5 185 50 234 50 249
addressable-to-s 5 164 5 171 50 182 50 204
binarytrees 5 82 5 88 50 136 50 168
blurhash 5 84 5 82 50 145 50 144
erubi 5 138 5 154 50 137 50 163
etanni 5 101 5 81 50 72 50 50
fannkuchredux 5 55 5 57 50 101 50 107
fluentd 5 61 5 61 50 27 50 27
gcbench 5 10 5 10 50 10 50 10
graphql 5 371 5 452 50 570 50 894
graphql-native 5 57 5 87 50 21 50 61
knucleotide 5 164 5 151 50 117 50 105
lee 5 23 5 31 50 10 50 20
matmul 5 53 5 51 50 88 50 95
nbody 5 250 5 249 50 663 50 684
nqueens 5 119 5 126 50 554 50 598
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 181 50 698 50 685
protoboeuf-encode 5 199 5 202 50 808 50 813
rack 5 434 5 470 50 710 50 782
ruby-json 5 84 5 114 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 235
string_malloc_pressure 5 146 5 32 50 101 50 10
sudoku 5 48 5 50 50 154 50 168
tinygql 5 41 5 43 50 40 50 50
30k_ifelse 5 28 5 28 50 184 50 184
30k_methods 5 38 5 39 50 458 50 452
attr_accessor 5 157 5 163 50 1835 50 1852
cfunc_itself 5 348 5 323 50 1255 50 1258
fib 5 125 5 136 50 939 50 939
getivar 5 210 5 305 50 2312 50 2415
getivar-module 5 103 5 142 50 89 50 117
keyword_args 5 103 5 102 50 1240 50 1243
loops-times 5 23 5 25 50 63 50 61
object-new 5 268 5 476 50 296 50 1473
object-new-initialize 5 168 5 257 50 260 50 517
object-new-no-escape 5 80 5 140 50 89 50 364
respond_to 5 139 5 122 50 3903 50 3904
ruby-xor 5 247 5 225 50 1306 50 1296
send_bmethod 5 118 5 113 50 5539 50 4526
send_cfunc_block 5 107 5 104 50 306 50 292
send_rubyfunc_block 5 196 5 204 50 1371 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 298
setivar 5 359 5 343 50 4930 50 4923
setivar_object 5 341 5 273 50 763 50 723
setivar_young 5 341 5 273 50 808 50 732
str_concat 5 391 5 430 50 1202 50 1067
structaref 5 153 5 165 50 1797 50 1837
structaset 5 197 5 216 50 369 50 488
throw 5 1109 5 1301 50 1445 50 1687

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) 1563987 1372539 204 2677 0 0% 0 0 78.807234
chunky-png (click) 322696 266514 79 1372 1 0% 0 0 38.049741
erubi-rails (click) 1381114 1189324 268 3630 23 0% 0 0 94.157051
hexapdf (click) 1524065 1296623 593 15682 45 0% 0 0 424.22741
liquid-c (click) 541283 421016 114 2226 5 0% 0 0 57.974209
liquid-compile (click) 475151 369944 146 2679 2 0% 0 0 72.747845
liquid-il (click) 614827 584738 70 2717 0 0% 0 0 78.644425
liquid-render (click) 668022 602311 131 2945 8 0% 0 0 76.51473
lobsters (click) 8525872 7205981 3127 63006 125 0% 0 0 2033.091905
mail (click) 866096 805554 345 7654 40 0% 0 0 204.409779
psych-load (click) 285807 265105 60 820 2 0% 0 0 22.356225
railsbench (click) 3359086 2760286 1591 19736 105 0% 0 0 531.577735
rubocop (click) 5765057 4952542 3000 57020 132 0% 6 0 1605.090126
ruby-lsp (click) 1045174 924382 408 7425 47 0% 1 0 196.724191
sequel (click) 522141 463787 11 119 0 0% 0 0 4.33053
shipit (click) 6872729 5932710 3136 49909 147 0% 0 0 1584.503877
addressable-equality (click) 320763 256501 44 1381 1 0% 0 0 32.637248
addressable-getters (click) 284199 236291 26 863 0 0% 0 0 20.180071
addressable-join (click) 289691 228492 24 941 0 0% 0 0 22.89711
addressable-merge (click) 286854 251842 27 896 0 0% 0 0 20.810116
addressable-new (click) 246781 182141 21 563 0 0% 0 0 13.47506
addressable-normalize (click) 316116 251469 43 1327 1 0% 0 0 30.91337
addressable-parse (click) 286911 254545 26 880 0 0% 0 0 20.853299
addressable-setters (click) 264748 222647 20 582 0 0% 0 0 13.957966
addressable-to-s (click) 283807 210669 26 849 0 0% 0 0 20.064345
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.753947
blurhash (click) 52495 43786 27 607 0 0% 0 0 17.859508
erubi (click) 249978 225287 6 134 0 0% 0 0 3.79157
etanni (click) 33079 34728 8 114 0 0% 0 0 3.448137
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.788103
fluentd (click) 513001 459377 7 116 0 0% 0 0 3.602498
gcbench (click) 15893 8734 9 110 0 0% 0 0 3.492189
graphql (click) 414600 381014 74 1939 18 0% 0 0 52.057406
graphql-native (click) 358633 340224 39 532 0 0% 0 0 13.360924
knucleotide (click) 9961 2328 7 110 0 0% 0 0 4.72412
lee (click) 319226 289261 50 1101 0 0% 0 0 30.467587
matmul (click) 11103 4709 8 136 0 0% 0 0 4.139866
nbody (click) 14448 21176 6 251 0 0% 0 0 6.111038
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.188902
optcarrot (click) 321859 302768 188 4597 34 0% 0 0 106.37222
protoboeuf (click) 175400 243898 12 2904 0 0% 0 0 73.633211
protoboeuf-encode (click) 247853 316926 14 1820 0 0% 0 0 42.088208
rack (click) 284479 286050 35 581 0 0% 0 0 14.442172
ruby-json (click) 19789 17789 8 206 0 0% 0 0 5.706972
rubyboy (click) 709630 610942 154 6871 42 0% 0 0 163.034981
rubykon (click) 146721 137257 137 2078 3 0% 0 0 54.171622
splay (click) 34682 14303 9 175 0 0% 0 0 5.190993
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.731177
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.7861
tinygql (click) 302127 266929 59 1024 5 0% 0 0 26.225738
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1866.219803
30k_methods (click) 2278130 1643075 5780 19370 0 0% 0 0 473.301552
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.069162
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.527539
fib (click) 2659 2995 3 30 0 0% 0 0 1.121871
getivar (click) 3789 6778 3 79 0 0% 0 0 1.902716
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.29295
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.83097
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.894469
object-new (click) 2406 2818 2 36 0 0% 0 0 1.020215
object-new-initialize (click) 3156 3352 4 43 0 0% 0 0 1.303092
object-new-no-escape (click) 4285 4620 5 63 0 0% 0 0 1.70565
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.152418
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.788841
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.800492
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.295041
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.748481
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.049143
setivar (click) 2783 3726 3 46 0 0% 0 0 1.235115
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.391197
setivar_young (click) 4441 4926 4 63 0 0% 0 0 1.708344
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.439692
structaref (click) 4407 9095 3 88 0 0% 0 0 2.343368
structaset (click) 4113 5834 3 70 0 0% 0 0 1.755094
throw (click) 5953 4624 5 53 0 0% 0 0 1.761435

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.