Ruby Benchmarks

Details for Benchmarks at 2026-08-18 00:33:47 UTC

YJIT metrics from the ruby-bench suite using Ruby 221534546d.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 98.1% faster than CRuby 4.1.0dev
  • 7.9% faster than YJIT 3.4.7
On railsbench it is
  • 117.7% faster than CRuby 4.1.0dev
  • 16.3% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 5 minutes
aarch64 runtime: 7 hours, 47 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 98 50 201 50 236
chunky-png 5 32 5 33 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 423 5 447 50 619 50 668
liquid-compile 5 421 5 520 50 582 50 843
liquid-il 5 67 5 68 50 117 50 133
liquid-render 5 170 5 176 50 434 50 466
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 210 50 254 50 299
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 159 50 246 50 249
ruby-lsp 5 158 5 166 50 240 50 235
sequel 5 431 5 465 50 596 50 667
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 29 50 12 50 19
addressable-getters 5 164 5 176 50 184 50 216
addressable-join 5 75 5 84 50 66 50 86
addressable-merge 5 160 5 160 50 223 50 249
addressable-new 5 354 5 360 50 518 50 560
addressable-normalize 5 52 5 59 50 60 50 72
addressable-parse 5 104 5 109 50 104 50 123
addressable-setters 5 186 5 193 50 233 50 261
addressable-to-s 5 164 5 174 50 182 50 215
binarytrees 5 82 5 93 50 136 50 146
blurhash 5 84 5 83 50 145 50 145
erubi 5 140 5 157 50 139 50 160
etanni 5 101 5 83 50 70 50 50
fannkuchredux 5 55 5 56 50 100 50 108
fluentd 5 70 5 73 50 20 50 32
gcbench 5 10 5 10 50 10 50 16
graphql 5 375 5 463 50 571 50 999
graphql-native 5 57 5 89 50 21 50 71
knucleotide 5 163 5 156 50 118 50 109
lee 5 23 5 33 50 10 50 21
matmul 5 53 5 51 50 88 50 98
nbody 5 250 5 253 50 660 50 699
nqueens 5 119 5 127 50 554 50 598
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 172 5 181 50 696 50 807
protoboeuf-encode 5 200 5 200 50 798 50 800
rack 5 443 5 442 50 710 50 731
ruby-json 5 84 5 116 50 51 50 93
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 215 50 250 50 244
string_malloc_pressure 5 147 5 32 50 100 50 10
sudoku 5 48 5 49 50 155 50 169
tinygql 5 41 5 42 50 38 50 55
30k_ifelse 5 28 5 28 50 186 50 186
30k_methods 5 39 5 40 50 454 50 454
attr_accessor 5 156 5 199 50 1833 50 1912
cfunc_itself 5 348 5 350 50 1255 50 1258
fib 5 125 5 144 50 939 50 939
getivar 5 211 5 303 50 2305 50 2415
getivar-module 5 103 5 136 50 89 50 124
keyword_args 5 102 5 106 50 1240 50 1243
loops-times 5 23 5 26 50 63 50 62
object-new 5 267 5 488 50 296 50 1509
object-new-initialize 5 169 5 253 50 259 50 1016
object-new-no-escape 5 80 5 140 50 89 50 536
respond_to 5 139 5 124 50 3907 50 3902
ruby-xor 5 247 5 246 50 1305 50 1315
send_bmethod 5 117 5 120 50 5539 50 4527
send_cfunc_block 5 107 5 105 50 308 50 306
send_rubyfunc_block 5 195 5 204 50 1368 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 297
setivar 5 359 5 348 50 4929 50 4922
setivar_object 5 341 5 287 50 762 50 772
setivar_young 5 341 5 287 50 810 50 829
str_concat 5 391 5 445 50 1195 50 918
structaref 5 153 5 177 50 1800 50 1856
structaset 5 199 5 221 50 369 50 470
throw 5 1108 5 1415 50 1443 50 1891

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) 1552231 1423530 203 2605 0 0% 0 0 71.512158
chunky-png (click) 323272 274340 79 1376 1 0% 0 0 38.388917
erubi-rails (click) 1380171 1242980 268 3626 23 0% 0 0 93.499734
hexapdf (click) 1528339 1308278 593 15741 45 0% 0 0 429.233255
liquid-c (click) 543047 493600 113 2224 5 0% 0 0 61.642698
liquid-compile (click) 477637 419791 146 2666 2 0% 0 0 73.562624
liquid-il (click) 609331 553007 70 2725 0 0% 0 0 79.850956
liquid-render (click) 649373 567806 130 2946 8 0% 0 0 77.439647
lobsters (click) 8564927 7319167 3126 63524 125 0% 0 0 2031.75324
mail (click) 870889 824415 345 7716 40 0% 0 0 207.857776
psych-load (click) 283985 261821 60 829 2 0% 0 0 23.158468
railsbench (click) 3353103 3086445 1591 19736 105 0% 0 0 536.481393
rubocop (click) 5762600 5031393 3000 57026 132 0% 6 0 1621.414596
ruby-lsp (click) 1049425 914599 408 7449 47 0% 1 0 201.001147
sequel (click) 522995 497181 11 119 0 0% 0 0 4.190645
shipit (click) 7046033 5958773 3124 49933 147 0% 0 0 1613.191378
addressable-equality (click) 304640 286023 44 1381 1 0% 0 0 32.805191
addressable-getters (click) 283902 251657 26 863 0 0% 0 0 20.408363
addressable-join (click) 270119 220781 24 941 0 0% 0 0 22.350032
addressable-merge (click) 289425 262800 27 896 0 0% 0 0 21.500272
addressable-new (click) 264256 227540 21 563 0 0% 0 0 13.477604
addressable-normalize (click) 318977 262772 43 1327 1 0% 0 0 31.927575
addressable-parse (click) 286614 253527 26 880 0 0% 0 0 20.982635
addressable-setters (click) 264451 229821 20 582 0 0% 0 0 14.085173
addressable-to-s (click) 283444 225977 26 849 0 0% 0 0 20.251179
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.7666
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.831421
erubi (click) 246874 229434 6 134 0 0% 0 0 3.889562
etanni (click) 30080 23270 8 114 0 0% 0 0 3.444155
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.853362
fluentd (click) 503644 397383 7 116 0 0% 0 0 3.600395
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.493481
graphql (click) 415076 380135 74 1940 18 0% 0 0 52.973881
graphql-native (click) 358207 312820 39 532 0 0% 0 0 13.71842
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.672767
lee (click) 301282 274798 50 1102 0 0% 0 0 30.650362
matmul (click) 11103 4709 8 136 0 0% 0 0 4.084795
nbody (click) 14448 21176 6 251 0 0% 0 0 6.1253
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.237167
optcarrot (click) 321897 302848 188 4600 34 0% 0 0 108.206439
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.924154
protoboeuf-encode (click) 242247 233890 14 1820 0 0% 0 0 42.385016
rack (click) 281058 248878 35 581 0 0% 0 0 14.825169
ruby-json (click) 20108 18120 8 210 0 0% 0 0 5.763
rubyboy (click) 705496 639804 154 6875 42 0% 0 0 164.163215
rubykon (click) 146630 137068 137 2078 3 0% 0 0 54.718825
splay (click) 34617 22483 9 175 0 0% 0 0 5.330652
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.756696
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.903312
tinygql (click) 302454 265981 59 1026 5 0% 0 0 26.582488
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1871.282654
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 478.594762
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.051538
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.521477
fib (click) 2659 2995 3 30 0 0% 0 0 1.117648
getivar (click) 3789 6778 3 79 0 0% 0 0 1.890143
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.326115
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.79678
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.935086
object-new (click) 2406 2818 2 36 0 0% 0 0 1.021097
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.267527
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.763386
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.100832
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.799056
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.80754
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.323777
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.74189
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.055674
setivar (click) 2783 3726 3 46 0 0% 0 0 1.232042
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.399896
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.706814
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.44654
structaref (click) 4407 9095 3 88 0 0% 0 0 2.306829
structaset (click) 4113 5834 3 70 0 0% 0 0 1.77257
throw (click) 5953 4624 5 53 0 0% 0 0 1.774381

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.