Ruby Benchmarks

Details for Benchmarks at 2026-08-06 00:48:19 UTC

YJIT metrics from the ruby-bench suite using Ruby 8052f2492c.

Using the geomean of the headline benchmarks for x86 YJIT 4.1.0dev is
  • 96.3% faster than CRuby 4.1.0dev
  • 5.9% faster than YJIT 3.4.7
On railsbench it is
  • 116.7% faster than CRuby 4.1.0dev
  • 15.5% faster than YJIT 3.4.7
x86_64 runtime: 9 hours, 8 minutes
aarch64 runtime: 7 hours, 50 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 89 5 95 50 204 50 204
chunky-png 5 32 5 31 50 34 50 28
erubi-rails 5 15 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 442 50 623 50 664
liquid-compile 5 420 5 516 50 583 50 831
liquid-il 5 67 5 69 50 117 50 125
liquid-render 5 172 5 176 50 430 50 460
lobsters 5 20 5 21 50 10 50 10
mail 5 194 5 210 50 253 50 295
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 154 5 156 50 246 50 241
ruby-lsp 5 157 5 157 50 240 50 227
sequel 5 430 5 466 50 590 50 662
shipit 5 10 5 10 50 10 50 10
addressable-equality 5 26 5 29 50 12 50 17
addressable-getters 5 165 5 172 50 183 50 209
addressable-join 5 74 5 84 50 66 50 80
addressable-merge 5 161 5 160 50 222 50 230
addressable-new 5 351 5 346 50 520 50 512
addressable-normalize 5 52 5 58 50 60 50 69
addressable-parse 5 104 5 107 50 105 50 115
addressable-setters 5 184 5 187 50 233 50 247
addressable-to-s 5 164 5 172 50 182 50 207
binarytrees 5 82 5 88 50 136 50 168
blurhash 5 84 5 83 50 145 50 145
erubi 5 136 5 151 50 135 50 157
etanni 5 100 5 80 50 73 50 49
fannkuchredux 5 55 5 57 50 93 50 111
fluentd 5 63 5 62 50 21 50 28
gcbench 5 10 5 10 50 10 50 10
graphql 5 369 5 464 50 567 50 887
graphql-native 5 57 5 85 50 21 50 59
knucleotide 5 163 5 146 50 117 50 100
lee 5 23 5 31 50 10 50 20
matmul 5 53 5 52 50 88 50 99
nbody 5 250 5 239 50 661 50 598
nqueens 5 119 5 125 50 554 50 596
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 181 50 696 50 661
protoboeuf-encode 5 195 5 204 50 794 50 808
rack 5 447 5 475 50 708 50 783
ruby-json 5 84 5 113 50 51 50 91
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 22 50 10 50 10
splay 5 208 5 204 50 247 50 238
string_malloc_pressure 5 147 5 31 50 102 50 10
sudoku 5 48 5 50 50 155 50 173
tinygql 5 42 5 43 50 40 50 49
30k_ifelse 5 28 5 28 50 184 50 184
30k_methods 5 38 5 39 50 452 50 454
attr_accessor 5 157 5 176 50 1833 50 1882
cfunc_itself 5 348 5 330 50 1255 50 1258
fib 5 125 5 135 50 939 50 939
getivar 5 216 5 303 50 2306 50 2430
getivar-module 5 103 5 142 50 89 50 124
keyword_args 5 103 5 110 50 1237 50 1243
loops-times 5 23 5 25 50 63 50 62
object-new 5 268 5 478 50 296 50 1469
object-new-initialize 5 169 5 255 50 259 50 517
object-new-no-escape 5 81 5 138 50 89 50 365
respond_to 5 139 5 123 50 3903 50 3902
ruby-xor 5 247 5 236 50 1304 50 1310
send_bmethod 5 118 5 116 50 5539 50 4525
send_cfunc_block 5 107 5 109 50 306 50 316
send_rubyfunc_block 5 196 5 208 50 1370 50 1375
send_rubyfunc_inline 5 30 5 36 50 297 50 298
setivar 5 359 5 347 50 4930 50 4921
setivar_object 5 341 5 271 50 763 50 726
setivar_young 5 345 5 271 50 810 50 738
str_concat 5 391 5 435 50 1195 50 1063
structaref 5 153 5 194 50 1803 50 1877
structaset 5 198 5 231 50 370 50 491
throw 5 1111 5 1416 50 1443 50 1892

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) 1562424 1378412 204 2670 0 0% 0 0 74.868105
chunky-png (click) 322711 266514 79 1372 1 0% 0 0 38.119386
erubi-rails (click) 1380778 1295653 268 3630 23 0% 0 0 94.125341
hexapdf (click) 1525963 1332040 594 15691 45 0% 0 0 426.551275
liquid-c (click) 559066 451087 114 2226 5 0% 0 0 58.038168
liquid-compile (click) 478319 431392 146 2679 2 0% 0 0 72.538702
liquid-il (click) 614562 584604 70 2715 0 0% 0 0 79.190252
liquid-render (click) 668037 602311 131 2945 8 0% 0 0 77.526638
lobsters (click) 8526801 7221327 3126 62996 125 0% 0 0 2032.344235
mail (click) 866111 813714 345 7654 40 0% 0 0 205.479567
psych-load (click) 286772 283145 60 820 2 0% 0 0 22.924404
railsbench (click) 3359229 2793064 1591 19739 105 0% 0 0 535.028123
rubocop (click) 5765161 5001757 3000 57026 132 0% 6 0 1638.667993
ruby-lsp (click) 1036057 963241 408 7425 47 0% 1 0 196.865566
sequel (click) 523106 449039 11 119 0 0% 0 0 4.175913
shipit (click) 6879179 5864796 3135 49986 147 0% 0 0 1601.535498
addressable-equality (click) 323931 293393 44 1381 1 0% 0 0 33.688075
addressable-getters (click) 281039 224008 26 863 0 0% 0 0 19.896215
addressable-join (click) 289706 228492 24 941 0 0% 0 0 23.330266
addressable-merge (click) 289732 255655 27 896 0 0% 0 0 21.518923
addressable-new (click) 264568 228558 21 563 0 0% 0 0 13.646159
addressable-normalize (click) 319289 263790 43 1327 1 0% 0 0 31.928006
addressable-parse (click) 286926 254545 26 880 0 0% 0 0 20.95657
addressable-setters (click) 264763 222647 20 582 0 0% 0 0 14.031692
addressable-to-s (click) 283822 210669 26 849 0 0% 0 0 20.063359
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.785629
blurhash (click) 52495 43786 27 607 0 0% 0 0 17.953009
erubi (click) 249993 225287 6 134 0 0% 0 0 3.835859
etanni (click) 33079 34728 8 114 0 0% 0 0 3.41941
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.880591
fluentd (click) 513001 451149 7 116 0 0% 0 0 3.66898
gcbench (click) 15893 8734 9 110 0 0% 0 0 3.490486
graphql (click) 415565 382630 74 1939 18 0% 0 0 52.69227
graphql-native (click) 358648 340224 39 532 0 0% 0 0 13.391227
knucleotide (click) 9961 2328 7 110 0 0% 0 0 4.765168
lee (click) 319241 289261 50 1101 0 0% 0 0 30.389692
matmul (click) 11103 4709 8 136 0 0% 0 0 4.133037
nbody (click) 14448 21176 6 251 0 0% 0 0 6.126162
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.185524
optcarrot (click) 321897 302848 188 4600 34 0% 0 0 106.362672
protoboeuf (click) 175400 243898 12 2904 0 0% 0 0 73.87443
protoboeuf-encode (click) 247853 316926 14 1820 0 0% 0 0 42.427802
rack (click) 285444 246763 35 581 0 0% 0 0 14.567809
ruby-json (click) 19849 17818 8 210 0 0% 0 0 5.724182
rubyboy (click) 709705 594666 154 6875 42 0% 0 0 163.582762
rubykon (click) 146721 137257 137 2078 3 0% 0 0 54.44936
splay (click) 34682 14303 9 175 0 0% 0 0 5.209843
string_malloc_pressure (click) 4071 3932 6 49 0 0% 0 0 1.728524
sudoku (click) 51776 65830 7 871 0 0% 0 0 22.931627
tinygql (click) 302142 266929 59 1024 5 0% 0 0 26.425194
30k_ifelse (click) 6265365 5037717 9260 76309 0 0% 0 0 1875.389261
30k_methods (click) 2278130 1643075 5780 19370 0 0% 0 0 475.866195
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.072897
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.527614
fib (click) 2659 2995 3 30 0 0% 0 0 1.090807
getivar (click) 3789 6778 3 79 0 0% 0 0 1.930253
getivar-module (click) 6752 11953 4 142 0 0% 0 0 3.315868
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.773055
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.909146
object-new (click) 2406 2818 2 36 0 0% 0 0 0.982021
object-new-initialize (click) 3156 3352 4 43 0 0% 0 0 1.314007
object-new-no-escape (click) 4285 4620 5 63 0 0% 0 0 1.717416
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.145686
ruby-xor (click) 6037 9212 4 105 0 0% 0 0 2.790829
send_bmethod (click) 5508 5328 6 71 0 0% 0 0 1.799149
send_cfunc_block (click) 8981 6196 4 120 0 0% 0 0 2.286117
send_rubyfunc_block (click) 5649 4645 5 71 0 0% 0 0 1.729145
send_rubyfunc_inline (click) 5654 403 2 35 0 0% 0 0 1.069198
setivar (click) 2783 3726 3 46 0 0% 0 0 1.257829
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.385184
setivar_young (click) 4441 4926 4 63 0 0% 0 0 1.711515
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.514811
structaref (click) 4407 9095 3 88 0 0% 0 0 2.357178
structaset (click) 4113 5834 3 70 0 0% 0 0 1.767021
throw (click) 5953 4624 5 53 0 0% 0 0 1.768064

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.