YJIT Benchmarks

Details for Benchmarks at 2025-03-17 03:48:02 UTC

YJIT metrics from the yjit-bench suite using Ruby 3e04f7b69f.

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 87.2% faster than CRuby 3.5.0dev
  • 6.0% faster than YJIT 3.3.6
On railsbench it is
  • 98.6% faster than CRuby 3.5.0dev
  • 3.0% faster than YJIT 3.3.6
x86_64 runtime: 4 hours, 19 minutes
aarch64 runtime: 3 hours, 40 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.3.6 warmups CRuby 3.3.6 iters CRuby 3.5.0dev warmups CRuby 3.5.0dev iters YJIT 3.3.6 warmups YJIT 3.3.6 iters YJIT 3.5.0dev warmups YJIT 3.5.0dev iters
activerecord 5 84 5 84 50 157 50 167
chunky-png 5 32 5 34 50 15 50 35
erubi-rails 5 16 5 16 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 412 5 436 50 590 50 642
liquid-compile 5 408 5 418 50 540 50 568
liquid-render 5 171 5 175 50 405 50 436
lobsters 5 20 5 19 50 10 50 10
mail 5 195 5 196 50 251 50 253
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 156 5 158 50 252 50 267
ruby-lsp 5 157 5 166 50 241 50 247
sequel 5 433 5 414 50 603 50 582
binarytrees 5 84 5 86 50 149 50 142
blurhash 5 82 5 87 50 127 50 145
erubi 5 124 5 147 50 98 50 122
etanni 5 90 5 101 50 54 50 73
fannkuchredux 5 52 5 54 50 99 50 101
fluentd 5 64 5 66 50 25 50 26
graphql 5 85 5 85 50 57 50 56
graphql-native 5 39 5 51 50 10 50 14
lee 5 22 5 23 50 10 50 10
matmul 5 51 5 51 50 85 50 97
nbody 5 248 5 276 50 578 50 682
nqueens 5 120 5 128 50 75 50 555
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 174 5 188 50 620 50 732
protoboeuf-encode 5 180 5 204 50 328 50 812
rack 5 572 5 637 50 949 50 1055
ruby-json 5 84 5 85 50 49 50 51
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 20 5 22 50 10 50 10
sudoku 5 47 5 50 50 164 50 161
tinygql 5 35 5 39 50 22 50 29
30k_ifelse 5 28 5 28 50 216 50 208
30k_methods 5 39 5 38 50 481 50 478
cfunc_itself 5 346 5 355 50 1147 50 1258
fib 5 127 5 146 50 909 50 933
getivar 5 207 5 299 50 2242 50 2740
keyword_args 5 107 5 107 50 1042 50 1243
loops-times 5 24 5 28 50 48 50 65
object-new 5 322 5 327 50 404 50 379
respond_to 5 133 5 137 50 3258 50 3982
ruby-xor 5 241 5 259 50 803 50 1382
setivar 5 358 5 648 50 3194 50 5930
setivar_object 5 355 5 469 50 700 50 745
setivar_young 5 365 5 468 50 744 50 805
str_concat 5 398 5 434 50 968 50 1210
throw 5 1263 5 1297 50 1779 50 1722

Different Ruby configurations want different amounts of warmup. With no JIT, CRuby needs hardly any. YJIT and MJIT 3.0 both warm up quite quickly, while MJIT in 3.1 often slows down for a time as it compiles, after an unpredictable delay.

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) 1426322 1221900 209 2204 0 0% 0 0 63.99955
chunky-png (click) 285038 253130 84 1124 1 0% 0 0 33.346205
erubi-rails (click) 1889896 1566233 259 2976 19 0% 0 0 81.707984
hexapdf (click) 1440200 1236511 596 13147 41 0% 0 0 381.923564
liquid-c (click) 489899 450216 114 1743 5 0% 0 0 48.959998
liquid-compile (click) 416900 358452 146 2077 2 0% 0 0 64.161017
liquid-render (click) 607243 489344 131 2309 8 0% 0 0 65.649407
lobsters (click) 8150343 6747055 3160 52799 104 0% 0 0 1829.137292
mail (click) 728033 594000 342 5318 14 0% 0 0 154.521878
psych-load (click) 273074 223771 61 615 3 0% 0 0 19.143294
railsbench (click) 3252471 2772698 1645 16218 52 0% 0 0 471.874696
rubocop (click) 5675715 4828536 2887 50575 110 0% 4 0 1486.560875
ruby-lsp (click) 811740 748353 305 4735 24 0% 0 0 134.836475
sequel (click) 472137 413442 11 94 0 0% 0 0 3.322713
binarytrees (click) 7093 6143 6 52 0 0% 0 0 2.287197
blurhash (click) 50118 50863 27 438 0 0% 0 0 14.203087
erubi (click) 252346 220722 5 97 0 0% 0 0 3.274571
etanni (click) 27173 26329 8 88 0 0% 0 0 2.985344
fannkuchredux (click) 23046 13626 3 249 0 0% 0 0 7.361177
fluentd (click) 391970 329198 7 93 0 0% 0 0 3.170238
graphql (click) 427580 366162 66 676 0 0% 0 0 21.185539
graphql-native (click) 392131 343725 37 255 0 0% 0 0 8.904699
lee (click) 300029 261694 45 750 0 0% 0 0 23.424029
matmul (click) 10657 3512 8 109 0 0% 0 0 3.546802
nbody (click) 13065 17086 6 172 0 0% 0 0 4.41335
nqueens (click) 20163 27348 5 239 0 0% 0 0 6.879872
optcarrot (click) 319096 242804 188 4399 34 0% 0 0 101.478676
protoboeuf (click) 150678 129601 12 1479 0 0% 0 0 42.253019
protoboeuf-encode (click) 221107 212146 14 1220 0 0% 0 0 31.224693
rack (click) 224415 191808 32 385 0 0% 0 0 10.09998
ruby-json (click) 23859 20840 8 178 0 0% 0 0 5.019311
rubyboy (click) 684946 599639 177 5803 40 0% 0 0 144.490069
rubykon (click) 134065 128972 137 1489 3 0% 0 0 42.917937
sudoku (click) 45311 40871 7 516 0 0% 0 0 15.511468
tinygql (click) 295878 267730 58 762 5 0% 0 0 21.34782
30k_ifelse (click) 5658804 5284852 9259 51668 0 0% 0 0 1421.659228
30k_methods (click) 2234569 1592883 5778 19351 0 0% 0 0 454.649523
cfunc_itself (click) 5130 4086 4 47 0 0% 0 0 1.362942
fib (click) 2599 2861 3 26 0 0% 0 0 0.969419
getivar (click) 3501 4713 3 51 0 0% 0 0 1.343213
keyword_args (click) 6320 4813 5 49 0 0% 0 0 1.599627
loops-times (click) 6703 7405 5 71 0 0% 0 0 2.29575
object-new (click) 1933 2093 2 22 0 0% 0 0 0.849864
respond_to (click) 5868 6227 4 62 0 0% 0 0 1.736513
ruby-xor (click) 5331 6009 4 64 0 0% 0 0 1.885269
setivar (click) 2652 3389 3 31 0 0% 0 0 1.001415
setivar_object (click) 3181 3537 3 33 0 0% 0 0 1.119221
setivar_young (click) 3891 4259 4 41 0 0% 0 0 1.326765
str_concat (click) 5469 6016 6 62 0 0% 0 0 2.031848
throw (click) 5848 4291 5 46 0 0% 0 0 1.5946

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.