Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize string concatenation using << operator #617

Merged
merged 1 commit into from
Sep 8, 2024

Commits on Sep 8, 2024

  1. Optimize string concatenation using << operator

    This change enhances the efficiency of HTML string construction, by
    replacing `+=` operator with `<<`.
    
    The shovel operator (`<<`) modifies strings in-place, reducing memory
    allocation and improving overall performance compared to the `+=`
    operator.
    
    ### Test Case
    
    Ruby 3.3.5 x64 on M1 Pro
    
    ```rb
    Arbre::Context.new { div { |d| d.ul { li } } }.to_s
    ```
    
    #### Before
    
    ```
    --- Memory Profiler ---
    
    Total allocated: 4624 bytes (80 objects)
    Total retained:  0 bytes (0 objects)
    
    allocated memory by gem
    -----------------------------------
          4624  arbre/lib
    
    allocated memory by file
    -----------------------------------
          2560  arbre/html/tag.rb
          1120  arbre/element/builder_methods.rb
           400  arbre/element_collection.rb
           280  arbre/element.rb
           264  arbre/context.rb
    
    --- Benchmark: IPS ---
    
                    test     50.546k (± 1.4%) i/s -    254.550k in   5.037005s
    
    --- Benchmark: Memory ---
    
                    test     6.208k memsize (     0.000  retained)
                            99.000  objects (     0.000  retained)
                            29.000  strings (     0.000  retained)
    ```
    
    #### After
    
    ```
    --- Memory Profiler ---
    
    Total allocated: 3840 bytes (64 objects)
    Total retained:  0 bytes (0 objects)
    
    allocated memory by gem
    -----------------------------------
          3840  arbre/lib
    
    allocated memory by file
    -----------------------------------
          1776  arbre/html/tag.rb
          1120  arbre/element/builder_methods.rb
           400  arbre/element_collection.rb
           280  arbre/element.rb
           264  arbre/context.rb
    
    --- Benchmark: IPS ---
    
                    test     52.205k (± 1.6%) i/s -    265.659k in   5.090028s
    
    --- Benchmark: Memory ---
    
                    test     5.424k memsize (     0.000  retained)
                            83.000  objects (     0.000  retained)
                            19.000  strings (     0.000  retained)
    ```
    tagliala committed Sep 8, 2024
    Configuration menu
    Copy the full SHA
    34dc8f2 View commit details
    Browse the repository at this point in the history