Ruby Benchmarks

Details for Benchmarks at 2026-07-21 00:54:38 UTC

YJIT metrics from the ruby-bench suite using Ruby 46bcd7e58c.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 95.1% faster than CRuby 4.1.0dev
  • 4.9% faster than YJIT 3.4.7
On railsbench it is
  • 107.3% faster than CRuby 4.1.0dev
  • 8.5% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 9 minutes
aarch64 runtime: 7 hours, 53 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 96 50 200 50 193
chunky-png 5 32 5 31 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 441 50 619 50 666
liquid-compile 5 420 5 516 50 583 50 833
liquid-il 5 67 5 68 50 116 50 125
liquid-render 5 174 5 169 50 437 50 469
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 209 50 253 50 289
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 245 50 239
ruby-lsp 5 163 5 159 50 224 50 226
sequel 5 427 5 465 50 582 50 658
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 17
addressable-getters 5 165 5 170 50 184 50 204
addressable-join 5 75 5 84 50 66 50 78
addressable-merge 5 160 5 157 50 224 50 226
addressable-new 5 351 5 340 50 516 50 505
addressable-normalize 5 53 5 58 50 60 50 68
addressable-parse 5 103 5 105 50 103 50 113
addressable-setters 5 184 5 185 50 235 50 245
addressable-to-s 5 165 5 171 50 182 50 201
binarytrees 5 82 5 88 50 136 50 162
blurhash 5 84 5 84 50 145 50 145
erubi 5 139 5 153 50 129 50 159
etanni 5 100 5 80 50 72 50 48
fannkuchredux 5 55 5 58 50 101 50 112
fluentd 5 60 5 61 50 21 50 26
gcbench 5 10 5 10 50 10 50 10
graphql 5 372 5 455 50 531 50 894
graphql-native 5 57 5 85 50 21 50 47
knucleotide 5 163 5 145 50 117 50 99
lee 5 23 5 30 50 10 50 19
matmul 5 53 5 52 50 87 50 99
nbody 5 250 5 251 50 663 50 698
nqueens 5 119 5 124 50 554 50 605
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 179 50 697 50 695
protoboeuf-encode 5 201 5 204 50 800 50 808
rack 5 443 5 456 50 718 50 746
ruby-json 5 83 5 113 50 51 50 93
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 208 5 202 50 250 50 233
string_malloc_pressure 5 147 5 35 50 101 50 10
sudoku 5 48 5 50 50 155 50 163
tinygql 5 42 5 42 50 40 50 52
30k_ifelse 5 28 5 28 50 185 50 185
30k_methods 5 38 5 39 50 451 50 451
attr_accessor 5 157 5 169 50 1834 50 1863
cfunc_itself 5 347 5 311 50 1255 50 1258
fib 5 125 5 135 50 939 50 939
getivar 5 192 5 303 50 2305 50 2413
getivar-module 5 103 5 140 50 89 50 132
keyword_args 5 102 5 96 50 1240 50 1243
loops-times 5 23 5 26 50 63 50 63
object-new 5 268 5 481 50 297 50 1532
object-new-initialize 5 169 5 256 50 259 50 528
object-new-no-escape 5 80 5 141 50 89 50 369
respond_to 5 139 5 127 50 3900 50 3897
ruby-xor 5 247 5 238 50 1306 50 1315
send_bmethod 5 118 5 113 50 5538 50 4526
send_cfunc_block 5 106 5 102 50 305 50 288
send_rubyfunc_block 5 196 5 212 50 1371 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 298
setivar 5 359 5 348 50 4930 50 4924
setivar_object 5 341 5 271 50 760 50 583
setivar_young 5 341 5 270 50 808 50 581
str_concat 5 390 5 424 50 1202 50 1058
structaref 5 153 5 177 50 1799 50 1852
structaset 5 197 5 227 50 371 50 478
throw 5 1108 5 1331 50 1445 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) 1564150 1330173 204 2670 0 0% 0 0 78.433657
chunky-png (click) 306495 261911 79 1372 1 0% 0 0 42.936594
erubi-rails (click) 1381456 1253838 268 3630 23 0% 0 0 94.012178
hexapdf (click) 1525491 1337931 593 15682 44 0% 0 0 424.063015
liquid-c (click) 561935 460976 114 2226 5 0% 0 0 57.5919
liquid-compile (click) 482090 426502 146 2679 2 0% 0 0 72.576907
liquid-il (click) 618576 530649 70 2719 0 0% 0 0 79.387527
liquid-render (click) 671775 589229 131 2945 8 0% 0 0 77.01861
lobsters (click) 8539132 7281558 3126 63109 125 0% 0 0 2021.606746
mail (click) 868744 831392 345 7654 40 0% 0 0 205.493076
psych-load (click) 290287 228575 60 820 2 0% 0 0 23.194493
railsbench (click) 3360552 2906890 1592 19739 105 0% 0 0 535.265038
rubocop (click) 5767710 4967694 3001 57005 129 0% 6 0 1716.663923
ruby-lsp (click) 1047572 901317 408 7414 47 0% 1 0 197.086343
sequel (click) 510541 438890 11 119 0 0% 0 0 3.726604
shipit (click) 6999567 5950850 3131 50010 147 0% 0 0 1615.761111
addressable-equality (click) 322448 274004 44 1381 1 0% 0 0 32.799224
addressable-getters (click) 283266 266433 26 863 0 0% 0 0 20.324557
addressable-join (click) 291916 254571 24 941 0 0% 0 0 22.684052
addressable-merge (click) 291937 248981 27 896 0 0% 0 0 21.429095
addressable-new (click) 265828 236637 21 563 0 0% 0 0 13.326954
addressable-normalize (click) 318336 261159 43 1327 1 0% 0 0 31.454559
addressable-parse (click) 285978 219151 26 880 0 0% 0 0 20.811526
addressable-setters (click) 263810 236400 20 582 0 0% 0 0 13.788824
addressable-to-s (click) 282874 257195 26 849 0 0% 0 0 19.954812
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.755234
blurhash (click) 52495 43786 27 607 0 0% 0 0 17.885445
erubi (click) 251534 184287 6 134 0 0% 0 0 3.802055
etanni (click) 32989 26478 8 114 0 0% 0 0 3.458847
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.78829
fluentd (click) 516488 452981 7 116 0 0% 0 0 3.617262
gcbench (click) 15893 8734 9 110 0 0% 0 0 3.546531
graphql (click) 419153 369182 74 1939 19 0% 0 0 52.631574
graphql-native (click) 358674 306003 39 532 0 0% 0 0 13.672695
knucleotide (click) 9961 2328 7 110 0 0% 0 0 4.673159
lee (click) 321739 331411 50 1101 0 0% 0 0 30.259467
matmul (click) 11103 4709 8 136 0 0% 0 0 4.15828
nbody (click) 14448 21176 6 251 0 0% 0 0 6.159591
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.289557
optcarrot (click) 321859 302768 188 4597 34 0% 0 0 106.150201
protoboeuf (click) 175400 243898 12 2904 0 0% 0 0 74.067709
protoboeuf-encode (click) 247853 316926 14 1820 0 0% 0 0 42.820657
rack (click) 288893 241397 35 581 0 0% 0 0 14.4972
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.768852
rubyboy (click) 713258 605969 154 6871 42 0% 0 0 162.363768
rubykon (click) 146721 137257 137 2078 3 0% 0 0 54.595241
splay (click) 34682 14303 9 175 0 0% 0 0 5.309473
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.725789
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.925083
tinygql (click) 304638 284909 59 1024 5 0% 0 0 26.08928
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1868.635386
30k_methods (click) 2278130 1643075 5780 19370 0 0% 0 0 473.606803
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.059382
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.51974
fib (click) 2659 2995 3 30 0 0% 0 0 1.107138
getivar (click) 3789 6778 3 79 0 0% 0 0 1.933599
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.307412
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.78767
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.871873
object-new (click) 2406 2818 2 36 0 0% 0 0 1.008832
object-new-initialize (click) 3156 3352 4 43 0 0% 0 0 1.312651
object-new-no-escape (click) 4285 4620 5 63 0 0% 0 0 1.735389
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.119018
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.782907
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.811658
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.304881
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.748765
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.066754
setivar (click) 2783 3726 3 46 0 0% 0 0 1.246992
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.411334
setivar_young (click) 4441 4926 4 63 0 0% 0 0 1.736518
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.503887
structaref (click) 4407 9095 3 88 0 0% 0 0 2.329585
structaset (click) 4113 5834 3 70 0 0% 0 0 1.787589
throw (click) 5953 4624 5 53 0 0% 0 0 1.778465

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.