Ruby Benchmarks

Details for Benchmarks at 2026-07-11 00:53:18 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 99.8% faster than CRuby 4.1.0dev
  • 10.5% faster than YJIT 3.4.7
On railsbench it is
  • 116.2% faster than CRuby 4.1.0dev
  • 15.5% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 14 minutes
aarch64 runtime: 7 hours, 59 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 92 5 94 50 201 50 238
chunky-png 5 32 5 31 50 34 50 29
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 445 50 619 50 677
liquid-compile 5 421 5 513 50 581 50 843
liquid-render 5 169 5 175 50 433 50 469
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 210 50 252 50 307
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 156 50 248 50 251
ruby-lsp 5 155 5 162 50 240 50 221
sequel 5 427 5 473 50 596 50 672
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 30 50 12 50 18
addressable-getters 5 165 5 174 50 184 50 207
addressable-join 5 75 5 85 50 66 50 83
addressable-merge 5 161 5 162 50 222 50 240
addressable-new 5 353 5 348 50 521 50 529
addressable-normalize 5 53 5 59 50 60 50 70
addressable-parse 5 104 5 108 50 104 50 117
addressable-setters 5 183 5 189 50 234 50 251
addressable-to-s 5 164 5 173 50 182 50 206
binarytrees 5 81 5 86 50 136 50 162
blurhash 5 84 5 84 50 145 50 145
erubi 5 132 5 156 50 138 50 164
etanni 5 99 5 82 50 72 50 49
fannkuchredux 5 55 5 57 50 101 50 108
fluentd 5 62 5 63 50 20 50 26
gcbench 5 10 5 10 50 10 50 17
graphql 5 368 5 467 50 575 50 978
graphql-native 5 58 5 89 50 21 50 69
knucleotide 5 163 5 141 50 118 50 94
lee 5 23 5 30 50 10 50 18
matmul 5 53 5 53 50 88 50 99
nbody 5 250 5 247 50 662 50 641
nqueens 5 119 5 128 50 554 50 606
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 186 50 697 50 805
protoboeuf-encode 5 201 5 201 50 806 50 763
rack 5 440 5 477 50 705 50 793
ruby-json 5 84 5 113 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 207 50 250 50 249
string_malloc_pressure 5 145 5 34 50 103 50 10
sudoku 5 48 5 50 50 155 50 163
tinygql 5 42 5 43 50 40 50 56
30k_ifelse 5 28 5 28 50 186 50 185
30k_methods 5 38 5 39 50 448 50 456
attr_accessor 5 157 5 170 50 1832 50 1877
cfunc_itself 5 348 5 333 50 1255 50 1258
fib 5 125 5 135 50 939 50 939
getivar 5 216 5 335 50 2313 50 2442
getivar-module 5 103 5 132 50 89 50 261
keyword_args 5 102 5 103 50 1240 50 1243
loops-times 5 23 5 25 50 63 50 62
object-new 5 268 5 473 50 294 50 1484
object-new-initialize 5 169 5 239 50 259 50 1001
object-new-no-escape 5 80 5 132 50 89 50 526
respond_to 5 139 5 122 50 3906 50 3901
ruby-xor 5 247 5 236 50 1305 50 1316
send_bmethod 5 118 5 114 50 5540 50 4526
send_cfunc_block 5 106 5 102 50 304 50 305
send_rubyfunc_block 5 196 5 196 50 1372 50 1375
send_rubyfunc_inline 5 30 5 36 50 298 50 298
setivar 5 359 5 433 50 4929 50 4994
setivar_object 5 345 5 314 50 762 50 731
setivar_young 5 350 5 314 50 809 50 756
str_concat 5 390 5 446 50 1200 50 1061
structaref 5 153 5 165 50 1799 50 1842
structaset 5 198 5 199 50 369 50 486
throw 5 1107 5 1340 50 1443 50 1731

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) 1561480 1357728 204 2666 0 0% 0 0 73.848838
chunky-png (click) 310227 264692 79 1376 1 0% 0 0 38.310244
erubi-rails (click) 1380047 1191569 268 3626 23 0% 0 0 93.92411
hexapdf (click) 1532989 1246613 593 15747 44 0% 0 0 427.320334
liquid-c (click) 568228 488917 114 2240 5 0% 0 0 58.156405
liquid-compile (click) 483177 465267 146 2673 2 0% 0 0 73.214748
liquid-render (click) 672558 585454 131 2963 8 0% 0 0 76.8946
lobsters (click) 8563753 7202374 3126 63462 125 0% 0 0 2016.108375
mail (click) 874775 867564 345 7739 40 0% 0 0 208.51292
psych-load (click) 290214 218195 60 829 2 0% 0 0 23.640004
railsbench (click) 3357292 2901846 1592 19740 105 0% 0 0 534.014116
rubocop (click) 5794650 5004705 3001 57257 129 0% 6 0 1619.763304
ruby-lsp (click) 1051760 891281 408 7438 47 0% 1 0 204.136192
sequel (click) 507792 418738 11 119 0 0% 0 0 4.449577
shipit (click) 7049520 6050372 3129 49996 147 0% 0 0 1581.057989
addressable-equality (click) 323960 267174 44 1381 1 0% 0 0 33.454044
addressable-getters (click) 284244 242840 26 863 0 0% 0 0 19.971033
addressable-join (click) 291779 237302 24 941 0 0% 0 0 22.81971
addressable-merge (click) 289766 262175 27 896 0 0% 0 0 21.145877
addressable-new (click) 264318 202111 21 563 0 0% 0 0 13.245352
addressable-normalize (click) 319318 270339 43 1327 1 0% 0 0 31.754431
addressable-parse (click) 288997 263355 26 880 0 0% 0 0 20.957708
addressable-setters (click) 247865 175923 20 582 0 0% 0 0 13.852768
addressable-to-s (click) 281782 255526 26 849 0 0% 0 0 19.682403
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.751621
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.740395
erubi (click) 252789 234726 6 134 0 0% 0 0 3.827063
etanni (click) 32752 34339 8 114 0 0% 0 0 3.406375
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.854014
fluentd (click) 514413 442017 7 116 0 0% 0 0 3.591826
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.431971
graphql (click) 416539 388899 74 1940 19 0% 0 0 52.72973
graphql-native (click) 359797 305334 39 532 0 0% 0 0 13.610411
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.729143
lee (click) 320621 280936 50 1102 0 0% 0 0 30.737685
matmul (click) 11103 4709 8 136 0 0% 0 0 4.099137
nbody (click) 14448 21176 6 251 0 0% 0 0 6.11175
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.250539
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 105.739239
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 72.087585
protoboeuf-encode (click) 242245 233890 14 1820 0 0% 0 0 42.756625
rack (click) 286788 205688 35 581 0 0% 0 0 14.403349
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.675837
rubyboy (click) 693072 590244 154 6871 42 0% 0 0 162.783748
rubykon (click) 146630 137068 137 2078 3 0% 0 0 54.665434
splay (click) 34617 22483 9 175 0 0% 0 0 5.466758
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.693007
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.894678
tinygql (click) 303081 290010 59 1026 5 0% 0 0 26.190905
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1855.21599
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 475.284374
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.106385
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.470921
fib (click) 2659 2995 3 30 0 0% 0 0 1.139946
getivar (click) 3789 6778 3 79 0 0% 0 0 1.913158
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.303146
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.777718
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.883161
object-new (click) 2406 2818 2 36 0 0% 0 0 0.980835
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.319262
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.726557
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.11767
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.788698
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.824874
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.294593
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.715326
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.065776
setivar (click) 2783 3726 3 46 0 0% 0 0 1.252167
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.396954
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.683597
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.475058
structaref (click) 4407 9095 3 88 0 0% 0 0 2.317854
structaset (click) 4113 5834 3 70 0 0% 0 0 1.801037
throw (click) 5953 4624 5 53 0 0% 0 0 1.751445

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.