Skip to content

Instantly share code, notes, and snippets.

@mattnwa
Created August 23, 2017 20:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattnwa/22d73c455b99c564bcdec63f87447f75 to your computer and use it in GitHub Desktop.
Save mattnwa/22d73c455b99c564bcdec63f87447f75 to your computer and use it in GitHub Desktop.
Benchmarking upsert gem vs. find_or_create + update rails
# require 'benchmark/ips'
Benchmark.ips do |x|
# the warmup phase (default 2) and calculation phase (default 5)
x.config(:time => 5, :warmup => 2)
Times = 500
times = Times
def upsert(id)
Score.upsert({scoreable_id: 7864, scoreable_type: 'FacebookPage'}, raw_value: 1234)
end
def find_or_create(id)
Score.find_or_create_by(scoreable_id: 7864, scoreable_type: 'FacebookPage').update(raw_value: 1234)
end
def iterate
i = 0
while i < Times
yield
i += 1
end
end
x.report("upsert") do |times|
iterate { upsert(7864) }
end
x.report("find_or_create_by_update") do |times|
iterate { find_or_create(7864) }
end
# Compare the iterations per second of the various reports!
x.compare!
end
@mattnwa
Copy link
Author

mattnwa commented Aug 23, 2017

`0.101 (± 0.0%) i/s - 1.000 in 9.914837s

Comparison:
upsert: 0.2 i/s
find_or_create_by_update: 0.1 i/s - 1.74x slower

=> #<Benchmark::IPS::Report:0x007fce48a720b0
@DaTa=nil,
@entries=
[#<Benchmark::IPS::Report::Entry:0x007fce4fb288b8
@Iterations=1,
@Label="upsert",
@measurement_cycle=1,
@Microseconds=5685253.442993164,
@show_total_time=true,
@stats=#<Benchmark::IPS::Stats::SD:0x007fce4fb289a8 @error=0, @mean=0.17589365364748302>>,
#<Benchmark::IPS::Report::Entry:0x007fce54a89ee8
@Iterations=1,
@Label="find_or_create_by_update",
@measurement_cycle=1,
@Microseconds=9914837.382995605,
@show_total_time=true,
@stats=#<Benchmark::IPS::Stats::SD:0x007fce54a8a000 @error=0, @mean=0.10085894113755665>>]>`

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