Skip to content
  • Jean Boussier's avatar
    83c38571
    Specialize String#dup · 83c38571
    Jean Boussier authored
    `String#+@` is 2-3 times faster than `String#dup` because it can
    directly go through `rb_str_dup` instead of using the generic
    much slower `rb_obj_dup`.
    
    This fact led to the existance of the ugly `Performance/UnfreezeString`
    rubocop performance rule that encourage users to rewrite the much
    more readable and convenient `"foo".dup` into the ugly `(+"foo")`.
    
    Let's make that rubocop rule useless.
    
    ```
    compare-ruby: ruby 3.3.0dev (2023-11-20T02:02:55Z master 701b0650) [arm64-darwin22]
    last_commit=[ruby/prism] feat: add encoding for IBM865 (https://github.com/ruby/prism/pull/1884)
    built-ruby: ruby 3.3.0dev (2023-11-20T12:51:45Z faster-str-lit-dup 6b745bbc5d) [arm64-darwin22]
    warming up..
    
    |       |compare-ruby|built-ruby|
    |:------|-----------:|---------:|
    |uplus  |     16.312M|   16.332M|
    |       |           -|     1.00x|
    |dup    |      5.912M|   16.329M|
    |       |           -|     2.76x|
    ```
    83c38571
    Specialize String#dup
    Jean Boussier authored
    `String#+@` is 2-3 times faster than `String#dup` because it can
    directly go through `rb_str_dup` instead of using the generic
    much slower `rb_obj_dup`.
    
    This fact led to the existance of the ugly `Performance/UnfreezeString`
    rubocop performance rule that encourage users to rewrite the much
    more readable and convenient `"foo".dup` into the ugly `(+"foo")`.
    
    Let's make that rubocop rule useless.
    
    ```
    compare-ruby: ruby 3.3.0dev (2023-11-20T02:02:55Z master 701b0650) [arm64-darwin22]
    last_commit=[ruby/prism] feat: add encoding for IBM865 (https://github.com/ruby/prism/pull/1884)
    built-ruby: ruby 3.3.0dev (2023-11-20T12:51:45Z faster-str-lit-dup 6b745bbc5d) [arm64-darwin22]
    warming up..
    
    |       |compare-ruby|built-ruby|
    |:------|-----------:|---------:|
    |uplus  |     16.312M|   16.332M|
    |       |           -|     1.00x|
    |dup    |      5.912M|   16.329M|
    |       |           -|     2.76x|
    ```
Loading