Skip to content

Commit e8b873b

Browse files
committed
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) ```
1 parent 36a7de3 commit e8b873b

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

lib/arbre/html/tag.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,23 +116,23 @@ def closing_tag
116116
def indent(open_tag, child_content, close_tag)
117117
spaces = ' ' * indent_level * INDENT_SIZE
118118

119-
html = ""
119+
html = +""
120120

121121
if no_child? || child_is_text?
122122
if self_closing_tag?
123-
html += spaces + open_tag.sub( />$/, '/>' )
123+
html << spaces << open_tag.sub( />$/, '/>' )
124124
else
125125
# one line
126-
html += spaces + open_tag + child_content + close_tag
126+
html << spaces << open_tag << child_content << close_tag
127127
end
128128
else
129129
# multiple lines
130-
html += spaces + open_tag + "\n"
131-
html += child_content # the child takes care of its own spaces
132-
html += spaces + close_tag
130+
html << spaces << open_tag << "\n"
131+
html << child_content # the child takes care of its own spaces
132+
html << spaces << close_tag
133133
end
134134

135-
html += "\n"
135+
html << "\n"
136136

137137
html
138138
end

0 commit comments

Comments
 (0)