Ruby Benchmarks

Details for Benchmarks at 2025-11-17 00:41:31 UTC

YJIT metrics from the ruby-bench suite using Ruby 4870fbd04a.

Using the geomean of the headline benchmarks for x86 YJIT 4.0.0dev is
  • 87.5% faster than CRuby 4.0.0dev
  • 2.5% slower than YJIT 3.4.7
On railsbench it is
  • 96.6% faster than CRuby 4.0.0dev
  • 1.5% faster than YJIT 3.4.7
x86_64 runtime: 7 hours, 28 minutes
aarch64 runtime: 6 hours, 23 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.0.0dev warmups CRuby 4.0.0dev iters YJIT 3.4.7 warmups YJIT 3.4.7 iters YJIT 4.0.0dev warmups YJIT 4.0.0dev iters
activerecord 5 81 5 85 50 192 50 211
chunky-png 5 31 5 32 50 33 50 29
erubi-rails 5 15 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 395 50 628 50 563
liquid-compile 5 421 5 461 50 556 50 711
liquid-render 5 172 5 166 50 433 50 344
lobsters 5 20 5 20 50 10 50 10
mail 5 195 5 152 50 253 50 145
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 153 5 158 50 246 50 251
ruby-lsp 5 142 5 147 50 227 50 245
sequel 5 423 5 429 50 588 50 593
shipit 5 10 5 10 50 10 50 10
binarytrees 5 82 5 83 50 136 50 127
blurhash 5 83 5 87 50 143 50 145
erubi 5 136 5 135 50 119 50 138
etanni 5 99 5 69 50 72 50 35
fannkuchredux 5 54 5 56 50 102 50 99
fluentd 5 56 5 62 50 20 50 32
graphql 5 372 5 458 50 575 50 932
graphql-native 5 59 5 79 50 23 50 61
knucleotide 5 163 5 159 50 117 50 112
lee 5 23 5 22 50 10 50 10
matmul 5 51 5 51 50 94 50 91
nbody 5 247 5 272 50 676 50 663
nqueens 5 116 5 125 50 556 50 565
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 184 50 706 50 741
protoboeuf-encode 5 198 5 209 50 834 50 794
rack 5 438 5 441 50 710 50 698
ruby-json 5 84 5 99 50 47 50 71
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 21 50 10 50 10
sudoku 5 48 5 48 50 156 50 156
tinygql 5 41 5 43 50 36 50 48
30k_ifelse 5 28 5 28 50 185 50 185
30k_methods 5 38 5 41 50 455 50 453
attr_accessor 5 157 5 200 50 1834 50 1923
cfunc_itself 5 347 5 345 50 1255 50 1259
fib 5 124 5 142 50 939 50 940
getivar 5 216 5 305 50 2320 50 2414
keyword_args 5 100 5 108 50 1240 50 1242
loops-times 5 23 5 24 50 64 50 56
object-new 5 268 5 307 50 296 50 452
respond_to 5 139 5 135 50 3891 50 3906
ruby-xor 5 237 5 254 50 1313 50 1289
send_bmethod 5 116 5 124 50 5538 50 5537
send_cfunc_block 5 105 5 106 50 353 50 339
send_rubyfunc_block 5 248 5 245 50 6923 50 6920
setivar 5 360 5 364 50 4927 50 4942
setivar_object 5 341 5 319 50 753 50 600
setivar_young 5 341 5 323 50 795 50 629
str_concat 5 390 5 401 50 1202 50 1171
structaref 5 156 5 199 50 1813 50 1899
throw 5 1091 5 1151 50 1419 50 1403

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) 1550687 1307772 205 2579 0 0% 0 0 73.051534
chunky-png (click) 317323 243449 74 1322 1 0% 0 0 37.524107
erubi-rails (click) 1376139 1196814 268 3654 22 0% 0 0 98.162408
hexapdf (click) 1526054 1359466 593 15680 44 0% 0 0 436.723445
liquid-c (click) 556062 504108 114 2228 5 0% 0 0 60.55816
liquid-compile (click) 479952 424455 146 2725 2 0% 0 0 79.104746
liquid-render (click) 661842 602799 131 2946 8 0% 0 0 80.876246
lobsters (click) 8540615 7352993 3102 62624 118 0% 0 0 2105.536011
mail (click) 865142 868131 342 7700 40 0% 0 0 212.801216
psych-load (click) 288952 242636 61 832 2 0% 0 0 23.749012
railsbench (click) 3359274 2773117 1605 19585 47 0% 0 0 551.418063
rubocop (click) 5760815 4957540 3001 56847 125 0% 6 0 1771.148735
ruby-lsp (click) 963903 843186 347 6782 44 0% 1 0 182.298168
sequel (click) 503149 456630 11 119 0 0% 0 0 3.941293
shipit (click) 7488749 6243654 3263 51850 180 0% 0 0 1725.88427
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.779197
blurhash (click) 52292 43311 27 605 0 0% 0 0 18.081809
erubi (click) 238695 188716 6 134 0 0% 0 0 3.942689
etanni (click) 32930 35718 8 114 0 0% 0 0 3.604023
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 11.07351
fluentd (click) 490981 418006 7 115 0 0% 0 0 3.734417
graphql (click) 398119 340381 73 1925 18 0% 0 0 54.064169
graphql-native (click) 354838 312218 39 532 0 0% 0 0 14.043686
knucleotide (click) 9997 11103 7 113 0 0% 0 0 5.72062
lee (click) 318525 297515 49 1097 0 0% 0 0 31.633276
matmul (click) 11103 4709 8 136 0 0% 0 0 4.214175
nbody (click) 14448 21176 6 251 0 0% 0 0 6.068994
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.351178
optcarrot (click) 325946 290644 188 4740 34 0% 0 0 111.275331
protoboeuf (click) 170129 251445 12 2837 0 0% 0 0 73.224883
protoboeuf-encode (click) 243065 308311 14 1816 0 0% 0 0 44.705184
rack (click) 271865 271779 35 580 0 0% 0 0 15.436818
ruby-json (click) 19868 17928 8 206 0 0% 0 0 5.687903
rubyboy (click) 703072 572327 154 6864 42 0% 0 0 167.204553
rubykon (click) 146441 162602 137 2076 3 0% 0 0 56.424089
sudoku (click) 52278 66593 7 878 0 0% 0 0 23.58265
tinygql (click) 302331 257312 59 1031 5 0% 0 0 27.097899
30k_ifelse (click) 6222887 5052688 9260 75477 0 0% 0 0 1929.089136
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 493.874547
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.098843
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.526176
fib (click) 2659 2995 3 30 0 0% 0 0 1.151881
getivar (click) 3789 6778 3 79 0 0% 0 0 1.979889
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.795144
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.962002
object-new (click) 2406 2818 2 36 0 0% 0 0 1.129978
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.173292
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.861427
send_bmethod (click) 5238 4968 6 71 0 0% 0 0 1.760744
send_cfunc_block (click) 14669 12471 5 195 0 0% 0 0 4.271194
send_rubyfunc_block (click) 3904 4074 5 69 0 0% 0 0 1.504097
setivar (click) 2783 3726 3 46 0 0% 0 0 1.264141
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.411288
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.73914
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.460681
structaref (click) 4407 9095 3 88 0 0% 0 0 2.340546
throw (click) 5953 4624 5 53 0 0% 0 0 1.7994

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.