Ruby Benchmarks

Details for Benchmarks at 2026-09-05 00:59:30 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 96.5% faster than CRuby 4.1.0dev
  • 8.0% faster than YJIT 3.4.7
On railsbench it is
  • 107.6% faster than CRuby 4.1.0dev
  • 12.7% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 14 minutes
aarch64 runtime: 7 hours, 53 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 201 50 219
chunky-png 5 32 5 32 50 34 50 26
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 450 50 618 50 675
liquid-compile 5 455 5 521 50 582 50 845
liquid-il 5 65 5 69 50 116 50 134
liquid-render 5 172 5 174 50 430 50 469
lobsters 5 20 5 20 50 10 50 10
mail 5 193 5 211 50 253 50 294
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 161 50 246 50 250
ruby-lsp 5 163 5 167 50 224 50 239
sequel 5 423 5 463 50 589 50 648
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 27 5 30 50 12 50 18
addressable-getters 5 165 5 176 50 185 50 214
addressable-join 5 74 5 84 50 65 50 84
addressable-merge 5 162 5 162 50 221 50 244
addressable-new 5 352 5 357 50 518 50 541
addressable-normalize 5 52 5 59 50 61 50 71
addressable-parse 5 103 5 111 50 104 50 124
addressable-setters 5 184 5 195 50 235 50 260
addressable-to-s 5 165 5 176 50 182 50 212
binarytrees 5 81 5 90 50 136 50 169
blurhash 5 84 5 86 50 145 50 145
erubi 5 130 5 148 50 121 50 153
etanni 5 101 5 79 50 72 50 46
fannkuchredux 5 55 5 57 50 91 50 109
fluentd 5 56 5 75 50 20 50 31
gcbench 5 10 5 11 50 10 50 16
graphql 5 376 5 468 50 529 50 981
graphql-native 5 58 5 88 50 22 50 71
knucleotide 5 163 5 151 50 118 50 106
lee 5 23 5 33 50 10 50 22
matmul 5 53 5 51 50 88 50 98
nbody 5 250 5 265 50 662 50 684
nqueens 5 119 5 126 50 555 50 592
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 191 50 696 50 794
protoboeuf-encode 5 200 5 205 50 791 50 781
rack 5 445 5 459 50 710 50 741
ruby-json 5 84 5 112 50 51 50 87
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 209 5 222 50 250 50 269
string_malloc_pressure 5 147 5 32 50 102 50 10
sudoku 5 48 5 49 50 155 50 163
tinygql 5 41 5 44 50 36 50 56
30k_ifelse 5 28 5 29 50 186 50 183
30k_methods 5 38 5 39 50 449 50 455
30k_variables 5 20 5 23 50 10 50 10
attr_accessor 5 157 5 192 50 1831 50 1917
cfunc_itself 5 348 5 354 50 1255 50 1258
fib 5 124 5 140 50 939 50 939
getivar 5 215 5 314 50 2306 50 2423
getivar-module 5 103 5 139 50 89 50 122
keyword_args 5 102 5 102 50 1240 50 1243
loops-times 5 23 5 26 50 63 50 62
object-new 5 268 5 659 50 296 50 1562
object-new-initialize 5 168 5 269 50 259 50 1024
object-new-no-escape 5 81 5 152 50 89 50 541
respond_to 5 139 5 131 50 3905 50 3905
ruby-xor 5 246 5 257 50 1305 50 1300
send_bmethod 5 118 5 125 50 5539 50 4527
send_cfunc_block 5 107 5 112 50 306 50 306
send_rubyfunc_block 5 196 5 212 50 1372 50 1375
send_rubyfunc_inline 5 30 5 33 50 297 50 297
setivar 5 359 5 349 50 4930 50 4922
setivar_object 5 341 5 287 50 763 50 722
setivar_young 5 341 5 286 50 808 50 737
str_concat 5 391 5 423 50 1195 50 938
structaref 5 153 5 192 50 1800 50 1883
structaset 5 198 5 247 50 368 50 486
throw 5 1111 5 1307 50 1447 50 1567

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) 1563702 1439691 204 2693 0 0% 0 0 79.32709
chunky-png (click) 319720 287467 79 1378 1 0% 0 0 38.261932
erubi-rails (click) 1376110 1217636 268 3636 23 0% 0 0 94.598878
hexapdf (click) 1525196 1252048 593 15773 45 0% 0 0 426.688142
liquid-c (click) 561403 501444 113 2227 5 0% 0 0 62.535393
liquid-compile (click) 478006 405632 146 2677 2 0% 0 0 73.275261
liquid-il (click) 610280 515127 70 2732 0 0% 0 0 78.932013
liquid-render (click) 667677 592085 130 2949 8 0% 0 0 76.98771
lobsters (click) 8536710 7253788 3127 63435 125 0% 0 0 2026.494092
mail (click) 867615 863827 345 7750 40 0% 0 0 207.737586
psych-load (click) 287310 234235 60 836 2 0% 0 0 23.454525
railsbench (click) 3389093 3007415 1591 19816 105 0% 0 0 569.919675
rubocop (click) 5753439 4951133 3000 57130 133 0% 6 0 1619.254796
ruby-lsp (click) 1047899 931768 408 7486 47 0% 1 0 199.84879
sequel (click) 523731 474679 11 119 0 0% 0 0 4.106841
shipit (click) 6914436 5865306 3135 50489 147 0% 0 0 1604.232114
addressable-equality (click) 324579 310774 44 1382 1 0% 0 0 33.54408
addressable-getters (click) 284884 278232 26 863 0 0% 0 0 20.646546
addressable-join (click) 287410 258492 24 941 0 0% 0 0 23.100846
addressable-merge (click) 290407 289375 27 896 0 0% 0 0 21.695997
addressable-new (click) 261203 224821 21 564 0 0% 0 0 13.511059
addressable-normalize (click) 319932 313934 43 1328 1 0% 0 0 31.824884
addressable-parse (click) 287601 263723 26 880 0 0% 0 0 21.260679
addressable-setters (click) 265433 256396 20 582 0 0% 0 0 14.235839
addressable-to-s (click) 281581 248857 26 849 0 0% 0 0 19.947163
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.739555
blurhash (click) 52211 43340 27 606 0 0% 0 0 17.785917
erubi (click) 246397 221703 6 135 0 0% 0 0 3.991369
etanni (click) 30080 23270 8 114 0 0% 0 0 3.435866
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.818452
fluentd (click) 511229 440750 7 116 0 0% 0 0 3.664979
gcbench (click) 15503 8804 9 111 0 0% 0 0 3.393977
graphql (click) 415404 382238 74 1944 18 0% 0 0 53.047558
graphql-native (click) 358711 331163 39 532 0 0% 0 0 13.523736
knucleotide (click) 9939 10477 7 110 0 0% 0 0 4.712998
lee (click) 318487 256474 50 1107 0 0% 0 0 30.527226
matmul (click) 11076 4720 8 137 0 0% 0 0 4.153589
nbody (click) 14448 21176 6 251 0 0% 0 0 6.092473
nqueens (click) 22523 12434 5 390 0 0% 0 0 10.267849
optcarrot (click) 321902 302848 188 4600 34 0% 0 0 106.83931
protoboeuf (click) 169627 176954 12 2830 0 0% 0 0 71.541987
protoboeuf-encode (click) 242247 233890 14 1820 0 0% 0 0 42.408243
rack (click) 285034 213811 35 581 0 0% 0 0 15.154656
ruby-json (click) 19495 17440 8 211 0 0% 0 0 5.952549
rubyboy (click) 669107 639969 154 6525 42 0% 0 0 162.508652
rubykon (click) 146467 153511 137 2080 3 0% 0 0 54.46496
splay (click) 34536 22516 9 175 0 0% 0 0 5.225651
string_malloc_pressure (click) 4044 3947 6 50 0 0% 0 0 1.75451
sudoku (click) 51585 74062 7 873 0 0% 0 0 22.816037
tinygql (click) 297285 244998 59 1041 5 0% 0 0 26.325396
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1865.646081
30k_methods (click) 2278060 1643077 5780 19371 0 0% 0 0 475.73519
30k_variables (click) 8388846 23773775 302 188140 0 0% 0 0 4972.840346
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.069885
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.531664
fib (click) 2659 2995 3 30 0 0% 0 0 1.143649
getivar (click) 3789 6778 3 79 0 0% 0 0 1.910163
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.31126
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.80044
loops-times (click) 7066 8398 5 100 0 0% 0 0 2.876737
object-new (click) 2352 2825 2 38 0 0% 0 0 1.009229
object-new-initialize (click) 2988 3280 4 44 0 0% 0 0 1.288572
object-new-no-escape (click) 4240 4697 5 64 0 0% 0 0 1.833508
respond_to (click) 6370 6822 4 81 0 0% 0 0 2.134499
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.803527
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.807884
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.308415
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.781656
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.071694
setivar (click) 2783 3726 3 46 0 0% 0 0 1.225631
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.372447
setivar_young (click) 4273 4878 4 64 0 0% 0 0 1.700047
str_concat (click) 5772 6980 6 83 0 0% 0 0 2.436681
structaref (click) 4407 9095 3 88 0 0% 0 0 2.325882
structaset (click) 4113 5834 3 70 0 0% 0 0 1.804978
throw (click) 5953 4624 5 53 0 0% 0 0 1.813752

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.