Ruby Benchmarks

Details for Benchmarks at 2026-04-19 01:05:59 UTC

YJIT metrics from the ruby-bench suite using Ruby 699c13eede.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 99.4% faster than CRuby 4.1.0dev
  • 9.2% faster than YJIT 3.4.7
On railsbench it is
  • 112.7% faster than CRuby 4.1.0dev
  • 12.8% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 1 minutes
aarch64 runtime: 7 hours, 49 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 94 50 191 50 234
chunky-png 5 32 5 31 50 34 50 27
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 423 5 438 50 620 50 660
liquid-compile 5 421 5 488 50 543 50 761
liquid-render 5 173 5 171 50 430 50 455
lobsters 5 20 5 20 50 10 50 10
mail 5 194 5 199 50 254 50 283
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 247 50 253
ruby-lsp 5 153 5 160 50 230 50 236
sequel 5 427 5 455 50 580 50 632
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 27 50 12 50 11
addressable-getters 5 165 5 167 50 183 50 195
addressable-join 5 74 5 78 50 65 50 72
addressable-merge 5 160 5 152 50 222 50 219
addressable-new 5 352 5 340 50 517 50 522
addressable-normalize 5 53 5 53 50 60 50 59
addressable-parse 5 104 5 103 50 104 50 109
addressable-setters 5 185 5 175 50 233 50 232
addressable-to-s 5 163 5 166 50 181 50 194
binarytrees 5 81 5 85 50 136 50 144
blurhash 5 84 5 83 50 145 50 145
erubi 5 134 5 152 50 141 50 154
etanni 5 101 5 81 50 72 50 46
fannkuchredux 5 55 5 56 50 101 50 104
fluentd 5 56 5 59 50 20 50 32
gcbench 5 10 5 10 50 10 50 15
graphql 5 373 5 456 50 569 50 916
graphql-native 5 58 5 89 50 22 50 70
knucleotide 5 163 5 145 50 117 50 100
lee 5 23 5 29 50 10 50 15
matmul 5 53 5 56 50 88 50 94
nbody 5 250 5 281 50 663 50 705
nqueens 5 119 5 119 50 554 50 579
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 176 5 178 50 697 50 785
protoboeuf-encode 5 201 5 196 50 803 50 819
rack 5 441 5 443 50 710 50 718
ruby-json 5 83 5 105 50 50 50 82
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 207 5 223 50 250 50 282
sudoku 5 48 5 49 50 155 50 159
tinygql 5 42 5 42 50 36 50 52
30k_ifelse 5 28 5 28 50 185 50 184
30k_methods 5 38 5 39 50 446 50 457
attr_accessor 5 157 5 179 50 1831 50 1888
cfunc_itself 5 348 5 323 50 1255 50 1259
fib 5 125 5 134 50 939 50 939
getivar 5 211 5 302 50 2305 50 2415
getivar-module 5 103 5 137 50 89 50 268
keyword_args 5 102 5 101 50 1240 50 1242
loops-times 5 23 5 25 50 63 50 63
object-new 5 268 5 444 50 296 50 1515
object-new-initialize 5 169 5 249 50 259 50 1021
object-new-no-escape 5 81 5 133 50 89 50 515
respond_to 5 139 5 130 50 3905 50 3900
ruby-xor 5 247 5 235 50 1305 50 1310
send_bmethod 5 118 5 115 50 5539 50 4526
send_cfunc_block 5 107 5 107 50 305 50 276
send_rubyfunc_block 5 195 5 210 50 1372 50 1376
setivar 5 359 5 471 50 4930 50 5037
setivar_object 5 341 5 350 50 762 50 670
setivar_young 5 341 5 349 50 808 50 691
str_concat 5 392 5 445 50 1205 50 1172
structaref 5 153 5 188 50 1800 50 1874
structaset 5 198 5 204 50 367 50 469
throw 5 1109 5 1391 50 1440 50 1776

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) 1559476 1328807 203 2666 0 0% 0 0 75.543223
chunky-png (click) 321855 311592 79 1376 1 0% 0 0 37.828421
erubi-rails (click) 1380803 1223883 268 3626 23 0% 0 0 99.980675
hexapdf (click) 1533062 1294909 593 15778 44 0% 0 0 428.424938
liquid-c (click) 563981 499302 114 2240 5 0% 0 0 59.37953
liquid-compile (click) 469456 446621 146 2749 2 0% 0 0 86.180158
liquid-render (click) 669558 662513 131 2963 8 0% 0 0 77.582274
lobsters (click) 8599682 7255565 3125 63937 122 0% 0 0 2038.929363
mail (click) 876352 850850 345 7738 40 0% 0 0 209.04671
psych-load (click) 289949 257311 61 833 2 0% 0 0 23.825344
railsbench (click) 3363284 2977938 1592 19773 104 0% 0 0 533.27671
rubocop (click) 5786882 4950979 3002 57192 128 0% 6 0 1640.708178
ruby-lsp (click) 1047210 957926 409 7472 47 0% 1 0 199.76264
sequel (click) 507818 483618 11 121 0 0% 0 0 4.882732
shipit (click) 7210661 6197063 3117 50161 148 0% 0 0 1589.611964
addressable-equality (click) 318482 260494 44 1380 1 0% 0 0 36.282585
addressable-getters (click) 263329 217539 26 869 0 0% 0 0 21.893122
addressable-join (click) 287506 240390 24 945 0 0% 0 0 27.178209
addressable-merge (click) 285457 216163 27 900 0 0% 0 0 24.819486
addressable-new (click) 262529 248859 21 569 0 0% 0 0 14.419471
addressable-normalize (click) 314511 264565 43 1336 1 0% 0 0 34.465185
addressable-parse (click) 282968 223530 26 886 0 0% 0 0 23.536719
addressable-setters (click) 260157 182798 20 582 0 0% 0 0 16.488498
addressable-to-s (click) 281740 247235 26 853 0 0% 0 0 21.777311
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.700261
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.87214
erubi (click) 251950 200403 6 134 0 0% 0 0 3.899038
etanni (click) 32989 26478 8 114 0 0% 0 0 3.370916
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.786584
fluentd (click) 490802 405310 7 116 0 0% 0 0 3.694795
gcbench (click) 15808 8981 9 110 0 0% 0 0 3.58169
graphql (click) 414863 369827 73 1931 19 0% 0 0 52.578196
graphql-native (click) 355228 307202 39 532 0 0% 0 0 13.875778
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.74916
lee (click) 321778 272972 49 1099 0 0% 0 0 30.332005
matmul (click) 11103 4709 8 136 0 0% 0 0 4.087944
nbody (click) 14448 21176 6 251 0 0% 0 0 6.126356
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.153113
optcarrot (click) 321739 302768 188 4597 34 0% 0 0 107.155235
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.882906
protoboeuf-encode (click) 243323 242439 14 1820 0 0% 0 0 43.174641
rack (click) 285666 285354 35 581 0 0% 0 0 15.868112
ruby-json (click) 19699 17751 8 206 0 0% 0 0 5.685433
rubyboy (click) 709062 666876 154 6875 42 0% 0 0 163.196736
rubykon (click) 148777 155950 138 2107 4 0% 0 0 55.005052
splay (click) 34953 22682 9 175 0 0% 0 0 5.185715
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.898033
tinygql (click) 301660 279128 59 1032 5 0% 0 0 26.575102
30k_ifelse (click) 6265364 5037717 9260 76309 0 0% 0 0 1858.840099
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 471.39843
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.057768
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.497336
fib (click) 2659 2995 3 30 0 0% 0 0 1.087056
getivar (click) 3789 6778 3 79 0 0% 0 0 1.991368
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.336402
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.825563
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.961544
object-new (click) 2406 2818 2 36 0 0% 0 0 0.991361
object-new-initialize (click) 3015 3269 4 43 0 0% 0 0 1.276355
object-new-no-escape (click) 4540 5102 5 68 0 0% 0 0 1.985652
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.119555
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.819239
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.829353
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.317832
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.728229
setivar (click) 2783 3726 3 46 0 0% 0 0 1.237976
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.3958
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.690239
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.441667
structaref (click) 4407 9095 3 88 0 0% 0 0 2.340109
structaset (click) 4113 5834 3 70 0 0% 0 0 1.958846
throw (click) 5953 4624 5 53 0 0% 0 0 1.742826

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.