Skip to content

Conversation

@rwstauner
Copy link
Contributor

@rwstauner rwstauner commented Jan 31, 2026

Example output:

================================================================================
ZJIT Stats Comparison
================================================================================

  ruby-mdev (baseline):
    ruby 4.1.0dev (2026-01-30T17:29:15Z master 1298f9ac1a) +ZJIT dev +PRISM [arm64-darwin25]
  ruby-bdev:
    ruby 4.1.0dev (2026-01-30T17:29:15Z profile-block-arg 1298f9ac1a) +ZJIT dev +PRISM [arm64-darwin25]

BENCHMARK TIMINGS (lower is better)
--------------------------------------------------------------------------------
  lobsters:
    ruby-mdev            avg:   1.076s  min:   0.944s  ★ (baseline)
    ruby-bdev            avg:   1.103s  min:   0.967s       +2.5% (slower)
  railsbench:
    ruby-mdev            avg:   1.580s  min:   1.532s  ★ (baseline)
    ruby-bdev            avg:   1.587s  min:   1.539s       +0.4% (slower)

MEMORY USAGE
--------------------------------------------------------------------------------
  lobsters:
    ruby-mdev            maxrss:    510.3MB  zjit_mem:     65.9MB
    ruby-bdev            maxrss:    510.6MB  zjit_mem:     65.5MB
  railsbench:
    ruby-mdev            maxrss:    200.2MB  zjit_mem:     30.1MB
    ruby-bdev            maxrss:    203.9MB  zjit_mem:     29.8MB

NOT INLINED C METHODS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Kernel#instance_variable_defined?                416 →              8 ▼  -98.1%
    Numeric#nonzero?                               9,789 →          1,556 ▼  -84.1%
    ... and 11 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    String#<=>                                    9,896 →          1,674 ▼  -83.1%
    ... and 10 more

CALLS TO C FUNCTIONS FROM JIT CODE (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Kernel#instance_variable_defined?                416 →              8 ▼  -98.1%
    Class#new                                        561 →             22 ▼  -96.1%
    ... and 18 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    Numeric#nonzero?                              9,896 →          1,674 ▼  -83.1%
    ... and 15 more

NOT OPTIMIZED METHOD TYPES FOR SEND (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    optimized                                       0 →          4,591 ▲    new
  railsbench:
    optimized                                  19,471 →         49,608 ▲ +154.8%

NOT OPTIMIZED METHOD TYPES FOR SUPER (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    attrset                                     2,642 →          1,866 ▼  -29.4%

SEND FALLBACK REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    send_not_optimized_method_type              1,682 →          6,273 ▲ +272.9%
    one_or_more_complex_arg_pass            1,145,141 →      2,821,156 ▲ +146.4%
    send_no_profiles                        2,068,333 →        196,661 ▼  -90.5%
    ... and 3 more
  railsbench:
    send_not_optimized_method_type             19,471 →         49,608 ▲ +154.8%
    one_or_more_complex_arg_pass            2,641,602 →      4,786,718 ▲  +81.2%
    send_no_profiles                        4,046,018 →      1,069,740 ▼  -73.6%
    ... and 1 more

SETIVAR FALLBACK REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    new_shape_needs_extension                     946 →            170 ▼  -82.0%
  railsbench:
    new_shape_needs_extension                     935 →            161 ▼  -82.8%

GETBLOCKPARAMPROXY HANDLER (showing differences > 10.0%)
--------------------------------------------------------------------------------
  railsbench:
    no_profiles                                 1,146 →            350 ▼  -69.5%

COMPLEX ARGUMENT-PARAMETER FEATURES (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    caller_blockarg                            21,564 →      1,697,716 ▲+7772.9%
    caller_kwarg                               23,322 →        135,011 ▲ +478.9%
    caller_splat                               33,663 →         37,288 ▲  +10.8%
  railsbench:
    caller_kwarg                                  944 →        110,104 ▲+11563.6%
    caller_blockarg                           184,024 →      2,329,272 ▲+1165.7%
    caller_splat                              170,800 →        260,718 ▲  +52.6%

SIDE EXIT REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    obj_to_string_fallback                      1,948 →            443 ▼  -77.3%
  railsbench:
    obj_to_string_fallback                      2,021 →            370 ▼  -81.7%

NOT ANNOTATED C METHODS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Class#new                                        561 →             22 ▼  -96.1%
    String#<=>                                     9,789 →          1,556 ▼  -84.1%
    ... and 10 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    Numeric#nonzero?                              9,896 →          1,674 ▼  -83.1%
    ... and 11 more

Suggestions welcome for more useful output format/features/etc.

Still only print the stats when not already enabled.
Example output:

================================================================================
ZJIT Stats Comparison
================================================================================

  ruby-mdev (baseline):
    ruby 4.1.0dev (2026-01-30T17:29:15Z master 1298f9ac1a) +ZJIT dev +PRISM [arm64-darwin25]
  ruby-bdev:
    ruby 4.1.0dev (2026-01-30T17:29:15Z profile-block-arg 1298f9ac1a) +ZJIT dev +PRISM [arm64-darwin25]

BENCHMARK TIMINGS (lower is better)
--------------------------------------------------------------------------------
  lobsters:
    ruby-mdev            avg:   1.076s  min:   0.944s  ★ (baseline)
    ruby-bdev            avg:   1.103s  min:   0.967s       +2.5% (slower)
  railsbench:
    ruby-mdev            avg:   1.580s  min:   1.532s  ★ (baseline)
    ruby-bdev            avg:   1.587s  min:   1.539s       +0.4% (slower)

MEMORY USAGE
--------------------------------------------------------------------------------
  lobsters:
    ruby-mdev            maxrss:    510.3MB  zjit_mem:     65.9MB
    ruby-bdev            maxrss:    510.6MB  zjit_mem:     65.5MB
  railsbench:
    ruby-mdev            maxrss:    200.2MB  zjit_mem:     30.1MB
    ruby-bdev            maxrss:    203.9MB  zjit_mem:     29.8MB

NOT INLINED C METHODS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Kernel#instance_variable_defined?                416 →              8 ▼  -98.1%
    Numeric#nonzero?                               9,789 →          1,556 ▼  -84.1%
    ... and 11 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    String#<=>                                    9,896 →          1,674 ▼  -83.1%
    ... and 10 more

CALLS TO C FUNCTIONS FROM JIT CODE (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Kernel#instance_variable_defined?                416 →              8 ▼  -98.1%
    Class#new                                        561 →             22 ▼  -96.1%
    ... and 18 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    Numeric#nonzero?                              9,896 →          1,674 ▼  -83.1%
    ... and 15 more

NOT OPTIMIZED METHOD TYPES FOR SEND (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    optimized                                       0 →          4,591 ▲    new
  railsbench:
    optimized                                  19,471 →         49,608 ▲ +154.8%

NOT OPTIMIZED METHOD TYPES FOR SUPER (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    attrset                                     2,642 →          1,866 ▼  -29.4%

SEND FALLBACK REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    send_not_optimized_method_type              1,682 →          6,273 ▲ +272.9%
    one_or_more_complex_arg_pass            1,145,141 →      2,821,156 ▲ +146.4%
    send_no_profiles                        2,068,333 →        196,661 ▼  -90.5%
    ... and 3 more
  railsbench:
    send_not_optimized_method_type             19,471 →         49,608 ▲ +154.8%
    one_or_more_complex_arg_pass            2,641,602 →      4,786,718 ▲  +81.2%
    send_no_profiles                        4,046,018 →      1,069,740 ▼  -73.6%
    ... and 1 more

SETIVAR FALLBACK REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    new_shape_needs_extension                     946 →            170 ▼  -82.0%
  railsbench:
    new_shape_needs_extension                     935 →            161 ▼  -82.8%

GETBLOCKPARAMPROXY HANDLER (showing differences > 10.0%)
--------------------------------------------------------------------------------
  railsbench:
    no_profiles                                 1,146 →            350 ▼  -69.5%

COMPLEX ARGUMENT-PARAMETER FEATURES (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    caller_blockarg                            21,564 →      1,697,716 ▲+7772.9%
    caller_kwarg                               23,322 →        135,011 ▲ +478.9%
    caller_splat                               33,663 →         37,288 ▲  +10.8%
  railsbench:
    caller_kwarg                                  944 →        110,104 ▲+11563.6%
    caller_blockarg                           184,024 →      2,329,272 ▲+1165.7%
    caller_splat                              170,800 →        260,718 ▲  +52.6%

SIDE EXIT REASONS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    obj_to_string_fallback                      1,948 →            443 ▼  -77.3%
  railsbench:
    obj_to_string_fallback                      2,021 →            370 ▼  -81.7%

NOT ANNOTATED C METHODS (showing differences > 10.0%)
--------------------------------------------------------------------------------
  lobsters:
    #<Module:0x000000012a06a460>#object_id           241 →              0 ▼ -100.0%
    Class#new                                        561 →             22 ▼  -96.1%
    String#<=>                                     9,789 →          1,556 ▼  -84.1%
    ... and 10 more
  railsbench:
    Array#hash                                      133 →            285 ▲ +114.3%
    #<Module:0x000000012804a500>#enum_for           180 →              0 ▼ -100.0%
    Numeric#nonzero?                              9,896 →          1,674 ▼  -83.1%
    ... and 11 more
@rwstauner rwstauner changed the title Add script to diff zjit stats from output csvnnExample output Add script to diff zjit stats from output csv Jan 31, 2026
end.parse!

if ARGV.empty?
puts "Usage: #{$0} [options] <output.json> [benchmark ...]"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we document the usage in README and/or the top of this file as well? It's not immediately clear where output.json is located or how it's supposed to be generated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants