Ruby Benchmarks

Details for Benchmarks at 2025-11-07 00:39:45 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 91.1% faster than CRuby 3.5.0dev
  • the same speed as YJIT 3.4.7
On railsbench it is
  • 98.7% faster than CRuby 3.5.0dev
  • the same speed as YJIT 3.4.7
x86_64 runtime: 7 hours, 24 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 3.5.0dev warmups CRuby 3.5.0dev iters YJIT 3.4.7 warmups YJIT 3.4.7 iters YJIT 3.5.0dev warmups YJIT 3.5.0dev iters
activerecord 5 85 5 87 50 192 50 222
chunky-png 5 31 5 32 50 32 50 27
erubi-rails 5 15 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 422 5 394 50 624 50 540
liquid-compile 5 420 5 467 50 552 50 715
liquid-render 5 171 5 164 50 435 50 375
lobsters 5 20 5 20 50 10 50 10
mail 5 195 5 179 50 253 50 221
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 245 50 245
ruby-lsp 5 142 5 145 50 239 50 238
sequel 5 419 5 414 50 583 50 567
shipit 5 10 5 10 50 10 50 10
binarytrees 5 82 5 82 50 136 50 126
blurhash 5 83 5 83 50 143 50 144
erubi 5 132 5 128 50 129 50 125
etanni 5 98 5 63 50 71 50 28
fannkuchredux 5 55 5 57 50 102 50 104
fluentd 5 56 5 56 50 20 50 23
graphql 5 372 5 453 50 575 50 889
graphql-native 5 58 5 79 50 22 50 61
knucleotide 5 163 5 156 50 118 50 110
lee 5 23 5 22 50 10 50 10
matmul 5 51 5 48 50 94 50 91
nbody 5 247 5 261 50 676 50 689
nqueens 5 116 5 123 50 556 50 554
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 180 50 707 50 642
protoboeuf-encode 5 198 5 197 50 833 50 784
rack 5 436 5 440 50 710 50 660
ruby-json 5 82 5 93 50 50 50 66
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 21 50 10 50 10
sudoku 5 48 5 48 50 157 50 149
tinygql 5 41 5 42 50 36 50 46
30k_ifelse 5 28 5 28 50 185 50 183
30k_methods 5 38 5 40 50 456 50 456
attr_accessor 5 157 5 185 50 1833 50 1898
cfunc_itself 5 347 5 341 50 1255 50 1258
fib 5 124 5 136 50 939 50 940
getivar 5 216 5 280 50 2315 50 2393
keyword_args 5 100 5 100 50 1240 50 1243
loops-times 5 23 5 25 50 64 50 56
object-new 5 268 5 353 50 296 50 582
respond_to 5 139 5 138 50 3881 50 3902
ruby-xor 5 237 5 249 50 1314 50 1277
send_bmethod 5 116 5 121 50 5538 50 5538
send_cfunc_block 5 107 5 99 50 353 50 334
send_rubyfunc_block 5 243 5 248 50 6925 50 6912
setivar 5 360 5 344 50 4927 50 4914
setivar_object 5 341 5 317 50 752 50 540
setivar_young 5 341 5 317 50 797 50 559
str_concat 5 391 5 388 50 1201 50 1024
structaref 5 156 5 187 50 1810 50 1878
throw 5 1089 5 1236 50 1408 50 1542

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) 1549278 1356456 205 2579 0 0% 0 0 73.254702
chunky-png (click) 317426 194382 74 1322 1 0% 0 0 37.808155
erubi-rails (click) 1964577 1732499 262 3666 22 0% 0 0 99.794897
hexapdf (click) 1527256 1393544 593 15699 44 0% 0 0 439.190423
liquid-c (click) 556455 471725 114 2228 5 0% 0 0 60.094891
liquid-compile (click) 479454 431869 146 2712 2 0% 0 0 81.049882
liquid-render (click) 662956 579174 131 2946 8 0% 0 0 80.095497
lobsters (click) 8470234 7044952 3101 62532 118 0% 0 0 2094.721456
mail (click) 864398 801868 342 7696 40 0% 0 0 213.069796
psych-load (click) 289055 242721 61 832 2 0% 0 0 23.881195
railsbench (click) 3350591 2763729 1605 19548 47 0% 0 0 546.873496
rubocop (click) 5762452 4869318 3001 56871 125 0% 6 0 1780.506885
ruby-lsp (click) 963468 834786 347 6782 44 0% 1 0 182.647276
sequel (click) 504304 433293 11 119 0 0% 0 0 3.902993
shipit (click) 7809070 6566725 3398 55296 186 0% 1 0 1833.045618
binarytrees (click) 7463 7718 6 76 0 0% 0 0 2.849024
blurhash (click) 52292 43311 27 605 0 0% 0 0 17.936005
erubi (click) 248327 182913 6 134 0 0% 0 0 3.935172
etanni (click) 32930 35718 8 114 0 0% 0 0 3.583927
fannkuchredux (click) 24735 32812 3 401 0 0% 0 0 10.948423
fluentd (click) 490012 408795 7 115 0 0% 0 0 3.707864
graphql (click) 405996 341813 73 1921 19 0% 0 0 53.782784
graphql-native (click) 354941 254959 39 532 0 0% 0 0 13.812227
knucleotide (click) 9997 11103 7 113 0 0% 0 0 7.354602
lee (click) 318306 330082 49 1097 0 0% 0 0 31.601556
matmul (click) 11103 4709 8 136 0 0% 0 0 4.226477
nbody (click) 14448 21176 6 251 0 0% 0 0 6.15038
nqueens (click) 22633 28819 5 389 0 0% 0 0 10.32573
optcarrot (click) 325946 290644 188 4740 34 0% 0 0 111.824724
protoboeuf (click) 170129 177717 12 2837 0 0% 0 0 72.496529
protoboeuf-encode (click) 243065 283735 14 1816 0 0% 0 0 44.485281
rack (click) 268807 211448 35 580 0 0% 0 0 14.647473
ruby-json (click) 19868 17928 8 206 0 0% 0 0 5.601285
rubyboy (click) 703711 564609 154 6864 42 0% 0 0 167.789607
rubykon (click) 146229 162118 137 2070 3 0% 0 0 56.258217
sudoku (click) 52278 66593 7 878 0 0% 0 0 23.275968
tinygql (click) 298667 229242 59 1031 5 0% 0 0 26.884268
30k_ifelse (click) 6222887 5052688 9260 75477 0 0% 0 0 1931.295244
30k_methods (click) 2278087 1643066 5780 19370 0 0% 0 0 491.323232
attr_accessor (click) 4349 7928 3 79 0 0% 0 0 2.123067
cfunc_itself (click) 5127 4155 4 53 0 0% 0 0 1.549036
fib (click) 2659 2995 3 30 0 0% 0 0 1.13051
getivar (click) 3789 6778 3 79 0 0% 0 0 1.969119
keyword_args (click) 6332 4965 5 56 0 0% 0 0 1.838894
loops-times (click) 7093 8387 5 100 0 0% 0 0 2.952285
object-new (click) 2406 2818 2 36 0 0% 0 0 1.098617
respond_to (click) 6451 6819 4 80 0 0% 0 0 2.145202
ruby-xor (click) 6026 856 4 105 0 0% 0 0 2.849174
send_bmethod (click) 5238 4968 6 71 0 0% 0 0 1.76633
send_cfunc_block (click) 14669 12471 5 195 0 0% 0 0 4.327012
send_rubyfunc_block (click) 3904 4074 5 69 0 0% 0 0 1.5002
setivar (click) 2783 3726 3 46 0 0% 0 0 1.315002
setivar_object (click) 3402 3956 3 49 0 0% 0 0 1.481664
setivar_young (click) 4300 4867 4 63 0 0% 0 0 1.787965
str_concat (click) 5799 6969 6 82 0 0% 0 0 2.465783
structaref (click) 4407 9095 3 88 0 0% 0 0 2.381841
throw (click) 5953 4624 5 53 0 0% 0 0 1.826853

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.