Skip to content

Instantly share code, notes, and snippets.

@tinogomes
Created January 9, 2014 11:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tinogomes/8332883 to your computer and use it in GitHub Desktop.
Save tinogomes/8332883 to your computer and use it in GitHub Desktop.
Benchmarking for Hash#compact and Hash#compact!
require 'benchmark'
class Hash
def compact_via_each
result = {}
each { |k, v| result[k] = v unless v.nil? }
result
end
def compact_via_reject
reject { |_, v| v.nil? }
end
def compact_via_select
select { |_, v| !v.nil? }
end
def compact_via_reject!
reject! { |_, v| v.nil? }
end
def compact_via_select!
select! { |_, v| !v.nil? }
end
end
CYCLES = 1_000_000
HASH = { a: 1, b: 2, c: nil }
Benchmark.bmbm do |x|
x.report('via each') { CYCLES.times{ HASH.compact_via_each } }
x.report('via reject') { CYCLES.times{ HASH.compact_via_reject } }
x.report('via select') { CYCLES.times{ HASH.compact_via_select } }
x.report('via reject!') { CYCLES.times{ HASH.compact_via_reject! } }
x.report('via select!') { CYCLES.times{ HASH.compact_via_select! } }
end
Rehearsal -----------------------------------------------
via each 2.290000 0.040000 2.330000 ( 2.343092)
via reject 2.940000 0.080000 3.020000 ( 3.040754)
via select 1.790000 0.090000 1.880000 ( 1.889668) *
via reject! 0.590000 0.010000 0.600000 ( 0.590372) **
via select! 0.630000 0.000000 0.630000 ( 0.636196)
-------------------------------------- total: 8.460000sec
user system total real
via each 1.900000 0.020000 1.920000 ( 1.923040)
via reject 2.570000 0.060000 2.630000 ( 2.638467)
via select 1.490000 0.090000 1.580000 ( 1.586627) *
via reject! 0.580000 0.000000 0.580000 ( 0.592631) **
via select! 0.630000 0.000000 0.630000 ( 0.630784)
* better for list
** better for replace
@Tonkonozhenko
Copy link

Why is there so big difference?
I've made come changes and here is my results.

...
Benchmark.bmbm do |x|
  x.report('via each') { CYCLES.times { HASH.dup.compact_via_each } }
  x.report('via reject') { CYCLES.times { HASH.dup.compact_via_reject } }
  x.report('via select') { CYCLES.times { HASH.dup.compact_via_select } }
  x.report('via reject!') { CYCLES.times { HASH.dup.compact_via_reject! } }
  x.report('via select!') { CYCLES.times { HASH.dup.compact_via_select! } }
end

MRI 2.1.4

Rehearsal -----------------------------------------------
via each      1.290000   0.010000   1.300000 (  1.296412)
via reject    1.150000   0.000000   1.150000 (  1.158505)
via select    1.160000   0.000000   1.160000 (  1.158948)
via reject!   0.960000   0.000000   0.960000 (  0.965918)
via select!   0.980000   0.000000   0.980000 (  0.983304)
-------------------------------------- total: 5.550000sec

                  user     system      total        real
via each      1.200000   0.000000   1.200000 (  1.206583)
via reject    1.160000   0.000000   1.160000 (  1.156540)
via select    1.240000   0.010000   1.250000 (  1.247227)
via reject!   0.900000   0.000000   0.900000 (  0.904802)
via select!   0.940000   0.000000   0.940000 (  0.941423)

jRuby-head

Rehearsal -----------------------------------------------
via each      6.500000   0.200000   6.700000 (  2.500000)
via reject    2.150000   0.030000   2.180000 (  1.262000)
via select    2.140000   0.020000   2.160000 (  1.265000)
via reject!   1.860000   0.040000   1.900000 (  1.115000)
via select!   1.890000   0.010000   1.900000 (  1.082000)
------------------------------------- total: 14.840000sec

                  user     system      total        real
via each      2.020000   0.010000   2.030000 (  1.171000)
via reject    2.060000   0.020000   2.080000 (  1.288000)
via select    2.090000   0.020000   2.110000 (  1.269000)
via reject!   1.820000   0.010000   1.830000 (  1.090000)
via select!   1.830000   0.010000   1.840000 (  1.070000)

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