Skip to content

Instantly share code, notes, and snippets.

@myronmarston
Last active May 20, 2016 00:27
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save myronmarston/c42a8fde09613745a3f3 to your computer and use it in GitHub Desktop.
Save myronmarston/c42a8fde09613745a3f3 to your computer and use it in GitHub Desktop.
Comparing perf of using `\` vs `+` for multiline strings
require 'benchmark/ips'
require 'allocation_stats'
def access_slashed_string
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis molestie " \
"elementum urna, a accumsan nunc euismod et. Aliquam porttitor, leo in " \
"aliquet aliquam, magna quam venenatis nulla, vel sagittis nisi nisi et " \
"nulla. Nulla quis facilisis turpis, vel blandit risus. Maecenas ut ante " \
"quis velit pretium pharetra ac rhoncus massa. Nulla quam dui, placerat " \
"eget quam vel, ultricies eleifend sem."
end
def access_plussed_string
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis molestie " +
"elementum urna, a accumsan nunc euismod et. Aliquam porttitor, leo in " +
"aliquet aliquam, magna quam venenatis nulla, vel sagittis nisi nisi et " +
"nulla. Nulla quis facilisis turpis, vel blandit risus. Maecenas ut ante " +
"quis velit pretium pharetra ac rhoncus massa. Nulla quam dui, placerat " +
"eget quam vel, ultricies eleifend sem."
end
Benchmark.ips do |x|
x.report("\\") { access_slashed_string }
x.report("+") { access_plussed_string }
end
slashed_stats = AllocationStats.trace { 1000.times { access_slashed_string } }
plussed_stats = AllocationStats.trace { 1000.times { access_plussed_string } }
puts "//:"
puts slashed_stats.allocations(alias_paths: true).group_by(:class).to_text
puts "+:"
puts plussed_stats.allocations(alias_paths: true).group_by(:class).to_text
__END__
336K vs 4.3M -- that's an order-of-magnitude faster to access strings
defined with a backslash rather than a plus.
Calculating -------------------------------------
\ 79.506k i/100ms
+ 24.230k i/100ms
-------------------------------------------------
\ 4.502M (±14.6%) i/s - 21.864M
+ 332.689k (±12.0%) i/s - 1.648M
//:
class count
------ -----
String 1000
+:
class count
------ -----
String 11000
@sdball
Copy link

sdball commented Jan 13, 2015

It's faster than the shovel operator too! TIL

require 'benchmark/ips'
require 'allocation_stats'

def access_slashed_string
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis molestie " \
"elementum urna, a accumsan nunc euismod et. Aliquam porttitor, leo in " \
"aliquet aliquam, magna quam venenatis nulla, vel sagittis nisi nisi et " \
"nulla. Nulla quis facilisis turpis, vel blandit risus. Maecenas ut ante " \
"quis velit pretium pharetra ac rhoncus massa. Nulla quam dui, placerat " \
"eget quam vel, ultricies eleifend sem."
end

def access_plussed_string
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis molestie " +
"elementum urna, a accumsan nunc euismod et. Aliquam porttitor, leo in " +
"aliquet aliquam, magna quam venenatis nulla, vel sagittis nisi nisi et " +
"nulla. Nulla quis facilisis turpis, vel blandit risus. Maecenas ut ante " +
"quis velit pretium pharetra ac rhoncus massa. Nulla quam dui, placerat " +
"eget quam vel, ultricies eleifend sem."
end

def access_shoveled_string
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis molestie " <<
"elementum urna, a accumsan nunc euismod et. Aliquam porttitor, leo in " <<
"aliquet aliquam, magna quam venenatis nulla, vel sagittis nisi nisi et " <<
"nulla. Nulla quis facilisis turpis, vel blandit risus. Maecenas ut ante " <<
"quis velit pretium pharetra ac rhoncus massa. Nulla quam dui, placerat " <<
"eget quam vel, ultricies eleifend sem."
end

Benchmark.ips do |x|
x.report("\\") { access_slashed_string }
x.report("+") { access_plussed_string }
x.report("<<") { access_shoveled_string }
end

slashed_stats = AllocationStats.trace { 1000.times { access_slashed_string } }
plussed_stats = AllocationStats.trace { 1000.times { access_plussed_string } }
shoveled_stats = AllocationStats.trace { 1000.times { access_shoveled_string } }

puts "//:"
puts slashed_stats.allocations(alias_paths: true).group_by(:class).to_text
puts "+:"
puts plussed_stats.allocations(alias_paths: true).group_by(:class).to_text
puts "<<:"
puts shoveled_stats.allocations(alias_paths: true).group_by(:class).to_text

__END__

Calculating -------------------------------------
                   \   127.708k i/100ms
                   +    36.662k i/100ms
                  <<    41.329k i/100ms
-------------------------------------------------
                   \      5.316M (± 5.5%) i/s -     26.563M
                   +    478.860k (± 3.2%) i/s -      2.420M
                  <<    578.838k (± 3.5%) i/s -      2.893M
//:
class   count
------  -----
String   1000
+:
class   count
------  -----
String  11000
<<:
class   count
------  -----
String   6000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment