YJIT Benchmarks

Details for Benchmarks at 2025-08-08 04:03:11 UTC

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

Using the geomean of the headline benchmarks for x86 YJIT 3.5.0dev is
  • 87.5% faster than CRuby 3.5.0dev
  • 3.6% faster than YJIT 3.3.6
On railsbench it is
  • 104.3% faster than CRuby 3.5.0dev
  • 8.6% faster than YJIT 3.3.6
x86_64 runtime: 4 hours, 29 minutes
aarch64 runtime: 3 hours, 49 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 82 5 83 50 155 50 152
chunky-png 5 31 5 32 50 14 50 23
erubi-rails 5 16 5 15 50 10 50 10
hexapdf 5 10 5 10 50 10 50 10
liquid-c 5 421 5 381 50 598 50 587
liquid-compile 5 410 5 465 50 572 50 674
liquid-render 5 171 5 168 50 407 50 363
lobsters 5 19 5 19 50 10 50 10
mail 5 190 5 178 50 251 50 200
psych-load 5 10 5 10 50 10 50 10
railsbench 5 10 5 10 50 10 50 10
rubocop 5 141 5 141 50 202 50 216
ruby-lsp 5 142 5 148 50 227 50 237
sequel 5 420 5 429 50 581 50 588
shipit 5 10 5 10 50 10 50 10
binarytrees 5 84 5 79 50 146 50 120
blurhash 5 82 5 85 50 127 50 143
erubi 5 116 5 145 50 87 50 136
etanni 5 91 5 95 50 53 50 67
fannkuchredux 5 52 5 57 50 96 50 98
fluentd 5 62 5 57 50 24 50 28
graphql 5 331 5 453 50 451 50 928
graphql-native 5 51 5 77 50 11 50 62
lee 5 23 5 22 50 10 50 10
matmul 5 51 5 48 50 88 50 89
nbody 5 248 5 243 50 584 50 692
nqueens 5 120 5 126 50 74 50 559
optcarrot 5 10 5 10 50 10 50 10
protoboeuf 5 179 5 185 50 621 50 735
protoboeuf-encode 5 178 5 197 50 328 50 787
rack 5 422 5 439 50 604 50 682
ruby-json 5 84 5 82 50 50 50 46
rubyboy 5 10 5 10 50 10 50 10
rubykon 5 21 5 21 50 10 50 10
sudoku 5 48 5 51 50 163 50 148
tinygql 5 41 5 43 50 39 50 50
30k_ifelse 5 28 5 27 50 215 50 184
30k_methods 5 39 5 38 50 480 50 462
attr_accessor 5 157 5 208 50 1724 50 1916
cfunc_itself 5 359 5 360 50 1138 50 1256
fib 5 127 5 141 50 901 50 928
getivar 5 212 5 305 50 2254 50 2387
keyword_args 5 104 5 109 50 1034 50 1243
loops-times 5 24 5 24 50 48 50 56
object-new 5 318 5 301 50 404 50 433
respond_to 5 133 5 134 50 3257 50 3930
ruby-xor 5 243 5 253 50 799 50 1279
setivar 5 361 5 355 50 3186 50 4913
setivar_object 5 354 5 313 50 671 50 607
setivar_young 5 368 5 315 50 703 50 614
str_concat 5 400 5 415 50 978 50 1207
throw 5 1271 5 1133 50 1728 50 1428

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) 1550482 1357220 206 2590 0 0% 0 0 73.386867
chunky-png (click) 363031 345523 74 1322 1 0% 0 0 39.025049
erubi-rails (click) 1936237 1661818 263 3776 22 0% 0 0 104.942668
hexapdf (click) 1562078 1359068 593 15653 45 0% 0 0 454.215862
liquid-c (click) 583043 544083 114 2217 5 0% 0 0 62.024788
liquid-compile (click) 503801 469297 146 2680 2 0% 0 0 78.372098
liquid-render (click) 690203 627618 131 2933 8 0% 0 0 81.315166
lobsters (click) 8613735 7285687 3162 64164 118 0% 0 0 2149.528628
mail (click) 875508 888366 342 7237 40 0% 0 0 208.735394
psych-load (click) 331830 308271 61 830 2 0% 0 0 24.511472
railsbench (click) 3373912 2947004 1649 20132 58 0% 0 0 570.905668
rubocop (click) 6154621 5319056 3013 63531 160 0% 6 0 1828.955908
ruby-lsp (click) 993053 960861 344 6734 47 0% 1 0 186.806297
sequel (click) 539747 472526 11 119 0 0% 0 0 4.159332
shipit (click) 7294547 6142747 3387 54051 214 0% 0 0 1747.224351
binarytrees (click) 154320 151361 6 64 0 0% 0 0 2.536284
blurhash (click) 199337 195889 27 603 0 0% 0 0 17.833368
erubi (click) 293334 276232 5 125 0 0% 0 0 3.90864
etanni (click) 176957 175574 7 98 0 0% 0 0 3.147637
fannkuchredux (click) 171788 169014 3 399 0 0% 0 0 10.980666
fluentd (click) 509009 406431 7 115 0 0% 0 0 3.765819
graphql (click) 444460 401426 72 1918 17 0% 0 0 55.143584
graphql-native (click) 387404 382900 39 532 0 0% 0 0 14.110039
lee (click) 358669 318732 49 1070 0 0% 0 0 31.862326
matmul (click) 158172 149053 8 132 0 0% 0 0 4.131484
nbody (click) 160937 156493 6 238 0 0% 0 0 5.795516
nqueens (click) 169699 173218 5 387 0 0% 0 0 10.283407
optcarrot (click) 472476 475516 188 4740 34 0% 0 0 112.334359
protoboeuf (click) 316633 370664 11 2828 0 0% 0 0 75.233402
protoboeuf-encode (click) 389300 386423 13 1805 0 0% 0 0 45.541854
rack (click) 322974 272272 35 580 0 0% 0 0 15.664166
ruby-json (click) 167719 163604 8 204 0 0% 0 0 5.702626
rubyboy (click) 739341 736287 154 6860 42 0% 0 0 173.218638
rubykon (click) 291698 263894 135 2052 3 0% 0 0 56.001401
sudoku (click) 198625 193641 6 863 0 0% 0 0 23.499969
tinygql (click) 347380 317795 59 1031 5 0% 0 0 27.043299
30k_ifelse (click) 6367005 5283666 9259 75432 0 0% 0 0 1936.354381
30k_methods (click) 2381613 1737482 5778 19357 0 0% 0 0 478.431701
attr_accessor (click) 151419 152402 3 78 0 0% 0 0 2.028279
cfunc_itself (click) 152174 148605 4 53 0 0% 0 0 1.412826
fib (click) 149706 139253 3 30 0 0% 0 0 1.011037
getivar (click) 150859 143060 3 78 0 0% 0 0 1.867937
keyword_args (click) 153379 149435 5 56 0 0% 0 0 1.691896
loops-times (click) 154019 144271 5 93 0 0% 0 0 2.705179
object-new (click) 149453 139076 2 36 0 0% 0 0 1.03163
respond_to (click) 153498 151269 4 80 0 0% 0 0 2.028288
ruby-xor (click) 152918 144943 4 100 0 0% 0 0 2.65912
setivar (click) 149830 139984 3 46 0 0% 0 0 1.210099
setivar_object (click) 150449 140214 3 49 0 0% 0 0 1.342109
setivar_young (click) 151347 149317 4 63 0 0% 0 0 1.635364
str_concat (click) 152894 151483 6 82 0 0% 0 0 2.415609
throw (click) 153000 149074 5 53 0 0% 0 0 1.767662

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.