diff options
author | Dillon Welch <daw0328@gmail.com> | 2018-03-19 18:36:03 -0700 |
---|---|---|
committer | Dillon Welch <daw0328@gmail.com> | 2018-03-20 06:30:03 -0700 |
commit | 8e095d699e9e6e626bdc53db7f756cf478a2c48c (patch) | |
tree | b6caa6905c5094aa448886523996e231d9f5df67 /activerecord/lib/active_record/core.rb | |
parent | 9d9f752661c31b3063d55bec14e797c957d2bb7d (diff) | |
download | rails-8e095d699e9e6e626bdc53db7f756cf478a2c48c.tar.gz rails-8e095d699e9e6e626bdc53db7f756cf478a2c48c.tar.bz2 rails-8e095d699e9e6e626bdc53db7f756cf478a2c48c.zip |
Interpolate '' instead of nil when multiple is false.
"my string #{nil}" results in an additional '' string allocation, I'm
guessing because the nil has to be converted to a string.
"my string #{'[]' if multiple}" results in "my string #{nil}" if
multiple is false. Doing "my string #{''}" does not result in an extra
string allocation. I moved the if multiple logic into a method so I only
had to make the change once.
```ruby
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update
your Bundler"
raise e
end
gemfile(true) do
source "https://rubygems.org"
gem "benchmark-ips"
gem "rails"
end
def allocate_count
GC.disable
before = ObjectSpace.count_objects
yield
after = ObjectSpace.count_objects
after.each { |k,v| after[k] = v - before[k] }
after[:T_HASH] -= 1 # probe effect - we created the before hash.
GC.enable
result = after.reject { |k,v| v == 0 }
GC.start
result
end
@html_options = {}
def master_version(multiple=nil)
"hi#{"[]" if multiple}"
end
def fast_version(multiple=nil)
str = multiple ? "[]" : ''
"hi#{str}"
end
def test
puts "master_version"
puts allocate_count { 1000.times { master_version } }
puts "master_version with arg"
puts allocate_count { 1000.times { master_version(' there') } }
puts "fast_version"
puts allocate_count { 1000.times { fast_version } }
puts "fast_version with arg"
puts allocate_count { 1000.times { fast_version(' there') } }
Benchmark.ips do |x|
x.report("master_version") { master_version }
x.report("master_version with arg") { master_version(' there') }
x.report("fast_version") { fast_version }
x.report("fast_version with arg") { fast_version(' there') }
x.compare!
end
end
test
```
results:
```ruby
master_version
{:FREE=>-1981, :T_STRING=>2052}
master_version with arg
{:FREE=>-1001, :T_STRING=>1000}
fast_version
{:FREE=>-1001, :T_STRING=>1000}
fast_version with arg
{:FREE=>-1001, :T_STRING=>1000}
Warming up --------------------------------------
master_version 138.851k i/100ms
master_version with arg
164.029k i/100ms
fast_version 165.737k i/100ms
fast_version with arg
167.016k i/100ms
Calculating -------------------------------------
master_version 2.464M (±14.7%) i/s - 11.941M in 5.023307s
master_version with arg
3.754M (± 8.5%) i/s - 18.699M in 5.021354s
fast_version 3.449M (±11.7%) i/s - 17.071M in 5.033312s
fast_version with arg
3.636M (± 6.9%) i/s - 18.205M in 5.034792s
Comparison:
master_version with arg: 3753896.1 i/s
fast_version with arg: 3636094.5 i/s - same-ish: difference falls within error
fast_version: 3448766.2 i/s - same-ish: difference falls within error
master_version: 2463857.3 i/s - 1.52x slower
```
Diffstat (limited to 'activerecord/lib/active_record/core.rb')
0 files changed, 0 insertions, 0 deletions