Skip to content
  • Jeremy Evans's avatar
    b08dacfe
    Optimize dynamic string interpolation for symbol/true/false/nil/0-9 · b08dacfe
    Jeremy Evans authored
    
    
    This provides a significant speedup for symbol, true, false,
    nil, and 0-9, class/module, and a small speedup in most other cases.
    
    Speedups (using included benchmarks):
    :symbol        :: 60%
    0-9            :: 50%
    Class/Module   :: 50%
    nil/true/false :: 20%
    integer        :: 10%
    []             :: 10%
    ""             :: 3%
    
    One reason this approach is faster is it reduces the number of
    VM instructions for each interpolated value.
    
    Initial idea, approach, and benchmarks from Eric Wong. I applied
    the same approach against the master branch, updating it to handle
    the significant internal changes since this was first proposed 4
    years ago (such as CALL_INFO/CALL_CACHE -> CALL_DATA). I also
    expanded it to optimize true/false/nil/0-9/class/module, and added
    handling of missing methods, refined methods, and RUBY_DEBUG.
    
    This renames the tostring insn to anytostring, and adds an
    objtostring insn that implements the optimization. This requires
    making a few functions non-static, and adding some non-static
    functions.
    
    This disables 4 YJIT tests.  Those tests should be reenabled after
    YJIT optimizes the new objtostring insn.
    
    Implements [Feature #13715]
    
    Co-authored-by: default avatarEric Wong <e@80x24.org>
    Co-authored-by: default avatarAlan Wu <XrXr@users.noreply.github.com>
    Co-authored-by: default avatarYusuke Endoh <mame@ruby-lang.org>
    Co-authored-by: default avatarKoichi Sasada <ko1@atdot.net>
    b08dacfe
    Optimize dynamic string interpolation for symbol/true/false/nil/0-9
    Jeremy Evans authored
    
    
    This provides a significant speedup for symbol, true, false,
    nil, and 0-9, class/module, and a small speedup in most other cases.
    
    Speedups (using included benchmarks):
    :symbol        :: 60%
    0-9            :: 50%
    Class/Module   :: 50%
    nil/true/false :: 20%
    integer        :: 10%
    []             :: 10%
    ""             :: 3%
    
    One reason this approach is faster is it reduces the number of
    VM instructions for each interpolated value.
    
    Initial idea, approach, and benchmarks from Eric Wong. I applied
    the same approach against the master branch, updating it to handle
    the significant internal changes since this was first proposed 4
    years ago (such as CALL_INFO/CALL_CACHE -> CALL_DATA). I also
    expanded it to optimize true/false/nil/0-9/class/module, and added
    handling of missing methods, refined methods, and RUBY_DEBUG.
    
    This renames the tostring insn to anytostring, and adds an
    objtostring insn that implements the optimization. This requires
    making a few functions non-static, and adding some non-static
    functions.
    
    This disables 4 YJIT tests.  Those tests should be reenabled after
    YJIT optimizes the new objtostring insn.
    
    Implements [Feature #13715]
    
    Co-authored-by: default avatarEric Wong <e@80x24.org>
    Co-authored-by: default avatarAlan Wu <XrXr@users.noreply.github.com>
    Co-authored-by: default avatarYusuke Endoh <mame@ruby-lang.org>
    Co-authored-by: default avatarKoichi Sasada <ko1@atdot.net>
Loading