aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/helpers/tag_helper.rb
diff options
context:
space:
mode:
authorBenjamin Quorning <bquorning@zendesk.com>2015-08-02 13:01:03 +0200
committerBenjamin Quorning <bquorning@zendesk.com>2015-08-02 14:31:07 +0200
commitd531edc829101d9969273f7f0f920c05000d6e62 (patch)
tree9526008d499969b9587670095fffeecd91b386c7 /actionview/lib/action_view/helpers/tag_helper.rb
parent13beb92a1ee189b64d3121213b7b8fcbf25a60ea (diff)
downloadrails-d531edc829101d9969273f7f0f920c05000d6e62.tar.gz
rails-d531edc829101d9969273f7f0f920c05000d6e62.tar.bz2
rails-d531edc829101d9969273f7f0f920c05000d6e62.zip
Save a string allocation inside loop
In the `tag_options` method, strings are continuously added to the `output` string. Previously, we concatenated two strings and added the generated string to `output`. By adding each of the strings to `output`, one after the other, we will save the allocation of that concatenated string. Benchmark: require 'benchmark/ips' sep = " ".freeze Benchmark.ips do |x| x.report("string +") { output = "" output << sep + "foo" } x.report("string <<") { output = "" output << sep output << "foo" } x.compare! end Results (Ruby 2.2.2): Calculating ------------------------------------- string + 88.086k i/100ms string << 94.287k i/100ms ------------------------------------------------- string + 2.407M (± 5.8%) i/s - 12.068M string << 2.591M (± 7.0%) i/s - 12.917M Comparison: string <<: 2591482.4 i/s string +: 2406883.7 i/s - 1.08x slower
Diffstat (limited to 'actionview/lib/action_view/helpers/tag_helper.rb')
-rw-r--r--actionview/lib/action_view/helpers/tag_helper.rb11
1 files changed, 8 insertions, 3 deletions
diff --git a/actionview/lib/action_view/helpers/tag_helper.rb b/actionview/lib/action_view/helpers/tag_helper.rb
index 30af09cbac..2562504896 100644
--- a/actionview/lib/action_view/helpers/tag_helper.rb
+++ b/actionview/lib/action_view/helpers/tag_helper.rb
@@ -154,12 +154,17 @@ module ActionView
options.each_pair do |key, value|
if TAG_PREFIXES.include?(key) && value.is_a?(Hash)
value.each_pair do |k, v|
- output << sep + prefix_tag_option(key, k, v, escape)
+ output << sep
+ output << prefix_tag_option(key, k, v, escape)
end
elsif BOOLEAN_ATTRIBUTES.include?(key)
- output << sep + boolean_tag_option(key) if value
+ if value
+ output << sep
+ output << boolean_tag_option(key)
+ end
elsif !value.nil?
- output << sep + tag_option(key, value, escape)
+ output << sep
+ output << tag_option(key, value, escape)
end
end
output unless output.empty?