Ruby Benchmarks

Details for Benchmarks at 2026-06-01 01:29:57 UTC

YJIT metrics from the ruby-bench suite using Ruby 12c8599ffa.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 100.3% faster than CRuby 4.1.0dev
  • 10.5% faster than YJIT 3.4.7
On railsbench it is
  • 118.7% faster than CRuby 4.1.0dev
  • 15.6% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 1 minutes
aarch64 runtime: 7 hours, 51 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 97 50 198 50 233
chunky-png 5 32 5 32 50 33 50 29
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 422 5 446 50 621 50 678
liquid-compile 5 421 5 525 50 583 50 866
liquid-render 5 169 5 173 50 433 50 473
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 210 50 254 50 312
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 246 50 256
ruby-lsp 5 156 5 160 50 240 50 230
sequel 5 427 5 467 50 589 50 650
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 29 50 12 50 19
addressable-getters 5 161 5 174 50 183 50 215
addressable-join 5 75 5 85 50 66 50 85
addressable-merge 5 160 5 160 50 222 50 250
addressable-new 5 352 5 351 50 521 50 552
addressable-normalize 5 53 5 58 50 60 50 73
addressable-parse 5 104 5 109 50 103 50 124
addressable-setters 5 186 5 189 50 233 50 259
addressable-to-s 5 164 5 174 50 182 50 215
binarytrees 5 81 5 87 50 136 50 148
blurhash 5 84 5 83 50 145 50 145
erubi 5 141 5 148 50 138 50 151
etanni 5 100 5 78 50 73 50 46
fannkuchredux 5 55 5 57 50 100 50 108
fluentd 5 62 5 67 50 21 50 29
gcbench 5 10 5 10 50 10 50 18
graphql 5 367 5 474 50 569 50 1001
graphql-native 5 57 5 90 50 21 50 71
knucleotide 5 163 5 142 50 118 50 96
lee 5 23 5 31 50 10 50 19
matmul 5 53 5 52 50 88 50 97
nbody 5 250 5 254 50 662 50 692
nqueens 5 119 5 121 50 554 50 591
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 177 50 697 50 825
protoboeuf-encode 5 198 5 196 50 803 50 809
rack 5 437 5 474 50 706 50 824
ruby-json 5 83 5 116 50 50 50 95
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 11
splay 5 208 5 223 50 250 50 281
sudoku 5 48 5 50 50 155 50 168
tinygql 5 41 5 43 50 40 50 57
30k_ifelse 5 28 5 28 50 186 50 184
30k_methods 5 38 5 39 50 454 50 453
attr_accessor 5 157 5 177 50 1833 50 1876
cfunc_itself 5 347 5 315 50 1255 50 1258
fib 5 125 5 134 50 939 50 938
getivar 5 210 5 308 50 2305 50 2419
getivar-module 5 103 5 133 50 89 50 260
keyword_args 5 102 5 102 50 1240 50 1243
loops-times 5 23 5 26 50 63 50 63
object-new 5 268 5 448 50 296 50 1524
object-new-initialize 5 169 5 233 50 259 50 1023
object-new-no-escape 5 81 5 137 50 89 50 513
respond_to 5 139 5 116 50 3905 50 3903
ruby-xor 5 247 5 233 50 1305 50 1295
send_bmethod 5 118 5 120 50 5539 50 4526
send_cfunc_block 5 107 5 106 50 305 50 269
send_rubyfunc_block 5 196 5 207 50 1372 50 1375
setivar 5 359 5 387 50 4930 50 4967
setivar_object 5 341 5 301 50 273 50 640
setivar_young 5 341 5 301 50 807 50 683
str_concat 5 390 5 449 50 1201 50 1140
structaref 5 153 5 179 50 1797 50 1857
structaset 5 197 5 223 50 371 50 490
throw 5 1109 5 1393 50 1443 50 1818

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) 1561032 1339427 203 2662 0 0% 0 0 78.031333
chunky-png (click) 315405 294725 79 1376 1 0% 0 0 37.904874
erubi-rails (click) 1385264 1245845 268 3626 23 0% 0 0 100.07838
hexapdf (click) 1524090 1332633 593 15767 44 0% 0 0 428.703543
liquid-c (click) 556644 464599 114 2240 5 0% 0 0 58.648093
liquid-compile (click) 481656 413023 146 2669 2 0% 0 0 73.007467
liquid-render (click) 663105 555283 131 2963 8 0% 0 0 77.107386
lobsters (click) 8562829 7306791 3125 63477 122 0% 0 0 2018.487804
mail (click) 873411 782380 345 7738 40 0% 0 0 207.845757
psych-load (click) 292686 269134 61 829 2 0% 0 0 23.107968
railsbench (click) 3357706 2776490 1592 19740 105 0% 0 0 534.254535
rubocop (click) 5798406 5056036 3003 57340 128 0% 6 0 1622.433282
ruby-lsp (click) 1052527 923850 409 7472 47 0% 1 0 200.192562
sequel (click) 510900 405194 11 119 0 0% 0 0 4.012155
shipit (click) 7052643 5966966 3123 50001 147 0% 0 0 1606.129853
addressable-equality (click) 325500 292953 44 1380 1 0% 0 0 33.220481
addressable-getters (click) 285832 235915 26 863 0 0% 0 0 20.472619
addressable-join (click) 280948 255657 24 941 0 0% 0 0 22.513893
addressable-merge (click) 281267 266718 27 896 0 0% 0 0 21.011898
addressable-new (click) 266068 228090 21 563 0 0% 0 0 13.662617
addressable-normalize (click) 320628 295934 43 1327 1 0% 0 0 31.725851
addressable-parse (click) 278579 224774 26 880 0 0% 0 0 20.841602
addressable-setters (click) 266263 230371 20 582 0 0% 0 0 14.034473
addressable-to-s (click) 282491 264071 26 849 0 0% 0 0 20.039115
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.794454
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.850617
erubi (click) 242258 212437 6 134 0 0% 0 0 3.877022
etanni (click) 32752 34339 8 114 0 0% 0 0 3.454474
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.783791
fluentd (click) 514716 465572 7 116 0 0% 0 0 3.644574
gcbench (click) 15640 8771 9 110 0 0% 0 0 3.321393
graphql (click) 414771 361254 73 1931 19 0% 0 0 52.635298
graphql-native (click) 358126 318628 39 532 0 0% 0 0 13.480189
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.664481
lee (click) 321755 297753 49 1093 0 0% 0 0 30.132129
matmul (click) 11103 4709 8 136 0 0% 0 0 4.068527
nbody (click) 14448 21176 6 251 0 0% 0 0 6.108503
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.244892
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 105.960368
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.26047
protoboeuf-encode (click) 243323 242439 14 1820 0 0% 0 0 42.83508
rack (click) 287931 238869 35 581 0 0% 0 0 14.480789
ruby-json (click) 19462 17420 8 206 0 0% 0 0 5.705736
rubyboy (click) 698686 620704 154 6871 42 0% 0 0 163.385972
rubykon (click) 147788 154811 138 2094 4 0% 0 0 54.749136
splay (click) 34617 22483 9 175 0 0% 0 0 5.178024
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.846874
tinygql (click) 304646 274779 59 1026 5 0% 0 0 26.348995
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1868.086895
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 474.648109
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.075633
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.501357
fib (click) 2659 2995 3 30 0 0% 0 0 1.097204
getivar (click) 3789 6778 3 79 0 0% 0 0 1.933762
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.322007
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.757827
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.936195
object-new (click) 2406 2818 2 36 0 0% 0 0 1.002466
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.280739
object-new-no-escape (click) 4295 4675 5 63 0 0% 0 0 1.740138
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.153545
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.771461
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.937397
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.278221
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.730006
setivar (click) 2783 3726 3 46 0 0% 0 0 1.22441
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.363323
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.727044
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.456059
structaref (click) 4407 9095 3 88 0 0% 0 0 2.345448
structaset (click) 4113 5834 3 70 0 0% 0 0 1.772641
throw (click) 5953 4624 5 53 0 0% 0 0 1.802664

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.