Ruby Benchmarks

Details for Benchmarks at 2026-06-09 01:18:41 UTC

YJIT metrics from the ruby-bench suite using Ruby 82329a5053.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 100.8% faster than CRuby 4.1.0dev
  • 10.6% faster than YJIT 3.4.7
On railsbench it is
  • 116.8% faster than CRuby 4.1.0dev
  • 14.6% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 2 minutes
aarch64 runtime: 7 hours, 52 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 96 50 200 50 236
chunky-png 5 32 5 31 50 33 50 28
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 425 5 447 50 618 50 678
liquid-compile 5 416 5 521 50 581 50 868
liquid-render 5 173 5 169 50 431 50 465
lobsters 5 20 5 21 50 10 50 10
mail 5 193 5 208 50 253 50 311
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 154 50 246 50 252
ruby-lsp 5 157 5 159 50 226 50 237
sequel 5 427 5 461 50 589 50 647
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 19
addressable-getters 5 165 5 175 50 183 50 215
addressable-join 5 73 5 85 50 66 50 86
addressable-merge 5 161 5 161 50 221 50 249
addressable-new 5 352 5 352 50 521 50 562
addressable-normalize 5 53 5 59 50 60 50 72
addressable-parse 5 104 5 108 50 104 50 124
addressable-setters 5 185 5 188 50 234 50 263
addressable-to-s 5 164 5 173 50 183 50 212
binarytrees 5 82 5 87 50 136 50 149
blurhash 5 84 5 83 50 145 50 145
erubi 5 139 5 146 50 126 50 144
etanni 5 100 5 79 50 73 50 44
fannkuchredux 5 55 5 55 50 101 50 103
fluentd 5 62 5 60 50 20 50 28
gcbench 5 10 5 10 50 10 50 18
graphql 5 372 5 458 50 568 50 978
graphql-native 5 58 5 91 50 22 50 74
knucleotide 5 163 5 143 50 117 50 96
lee 5 23 5 31 50 10 50 18
matmul 5 53 5 51 50 88 50 95
nbody 5 241 5 246 50 663 50 652
nqueens 5 119 5 128 50 555 50 590
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 175 5 176 50 698 50 811
protoboeuf-encode 5 201 5 202 50 802 50 801
rack 5 441 5 469 50 719 50 812
ruby-json 5 84 5 115 50 50 50 94
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 11
splay 5 209 5 222 50 247 50 275
sudoku 5 48 5 49 50 155 50 169
tinygql 5 42 5 43 50 34 50 56
30k_ifelse 5 28 5 28 50 186 50 185
30k_methods 5 38 5 39 50 457 50 451
attr_accessor 5 157 5 175 50 1832 50 1879
cfunc_itself 5 347 5 329 50 1255 50 1258
fib 5 124 5 136 50 939 50 939
getivar 5 211 5 328 50 2306 50 2434
getivar-module 5 103 5 136 50 89 50 283
keyword_args 5 102 5 106 50 1240 50 1243
loops-times 5 23 5 26 50 63 50 62
object-new 5 268 5 477 50 297 50 1533
object-new-initialize 5 168 5 237 50 259 50 1033
object-new-no-escape 5 80 5 140 50 89 50 525
respond_to 5 139 5 125 50 3904 50 3891
ruby-xor 5 246 5 242 50 1305 50 1308
send_bmethod 5 118 5 116 50 5539 50 4526
send_cfunc_block 5 106 5 105 50 304 50 314
send_rubyfunc_block 5 196 5 204 50 1372 50 1375
setivar 5 359 5 397 50 4931 50 4976
setivar_object 5 341 5 305 50 763 50 591
setivar_young 5 344 5 305 50 809 50 610
str_concat 5 391 5 435 50 1201 50 1110
structaref 5 153 5 171 50 1801 50 1840
structaset 5 199 5 221 50 369 50 484
throw 5 1109 5 1420 50 1445 50 1798

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) 1553371 1348388 202 2604 0 0% 0 0 71.618858
chunky-png (click) 322107 303488 79 1376 1 0% 0 0 37.925523
erubi-rails (click) 1385318 1245809 268 3626 23 0% 0 0 94.519701
hexapdf (click) 1534079 1329225 593 15767 44 0% 0 0 430.617679
liquid-c (click) 566551 452936 114 2240 5 0% 0 0 58.629265
liquid-compile (click) 481571 388389 146 2669 2 0% 0 0 73.717407
liquid-render (click) 672029 533792 131 2963 8 0% 0 0 78.24713
lobsters (click) 8551868 7188043 3122 63309 122 0% 0 0 2020.11628
mail (click) 876654 835318 345 7738 40 0% 0 0 209.359028
psych-load (click) 291748 267478 61 829 2 0% 0 0 23.592788
railsbench (click) 3357948 2776431 1592 19742 105 0% 0 0 536.087238
rubocop (click) 5802871 4987651 3002 57344 127 0% 6 0 1650.375228
ruby-lsp (click) 1051501 922210 409 7470 47 0% 1 0 201.924946
sequel (click) 509846 403504 11 119 0 0% 0 0 3.88389
shipit (click) 7079424 6014341 3122 49953 147 0% 0 0 1580.872094
addressable-equality (click) 325512 292953 44 1380 1 0% 0 0 33.286304
addressable-getters (click) 285844 235915 26 863 0 0% 0 0 20.43702
addressable-join (click) 291218 252600 24 941 0 0% 0 0 23.222831
addressable-merge (click) 287964 242713 27 896 0 0% 0 0 21.151749
addressable-new (click) 262800 215650 21 563 0 0% 0 0 13.432176
addressable-normalize (click) 317634 267373 43 1327 1 0% 0 0 31.615988
addressable-parse (click) 284434 257404 26 880 0 0% 0 0 20.74286
addressable-setters (click) 266275 230371 20 582 0 0% 0 0 14.121186
addressable-to-s (click) 281684 230286 26 849 0 0% 0 0 19.907176
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.754901
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.846513
erubi (click) 248955 213013 6 134 0 0% 0 0 3.838908
etanni (click) 32989 26478 8 114 0 0% 0 0 3.438487
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.912773
fluentd (click) 512397 495303 7 116 0 0% 0 0 3.599583
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.333141
graphql (click) 416782 363169 73 1931 19 0% 0 0 52.727869
graphql-native (click) 361087 346750 39 532 0 0% 0 0 13.761788
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.693639
lee (click) 318482 301692 49 1093 0 0% 0 0 30.490481
matmul (click) 11103 4709 8 136 0 0% 0 0 4.108045
nbody (click) 14448 21176 6 251 0 0% 0 0 6.138545
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.257373
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 106.932731
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.950995
protoboeuf-encode (click) 243323 242439 14 1820 0 0% 0 0 43.080684
rack (click) 284660 242828 35 581 0 0% 0 0 14.586067
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.749639
rubyboy (click) 705534 596944 154 6871 42 0% 0 0 163.65646
rubykon (click) 147788 154811 138 2094 4 0% 0 0 54.944142
splay (click) 34617 22483 9 175 0 0% 0 0 5.211825
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.898359
tinygql (click) 300602 237132 59 1026 5 0% 0 0 26.402108
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1869.737825
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 478.323944
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.120446
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.507444
fib (click) 2659 2995 3 30 0 0% 0 0 1.098336
getivar (click) 3789 6778 3 79 0 0% 0 0 1.956923
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.329396
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.812808
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.989485
object-new (click) 2406 2818 2 36 0 0% 0 0 1.010852
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.299467
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.75697
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.103715
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.77465
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.823437
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.312255
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.73862
setivar (click) 2783 3726 3 46 0 0% 0 0 1.247615
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.395924
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.693193
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.45469
structaref (click) 4407 9095 3 88 0 0% 0 0 2.378049
structaset (click) 4113 5834 3 70 0 0% 0 0 1.750767
throw (click) 5953 4624 5 53 0 0% 0 0 1.768497

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.