Skip to content

Instantly share code, notes, and snippets.

@vkmagalhaes
Created March 7, 2018 17:19
Show Gist options
  • Save vkmagalhaes/5f109a393ba547625ef0d4ad36db6d03 to your computer and use it in GitHub Desktop.
Save vkmagalhaes/5f109a393ba547625ef0d4ad36db6d03 to your computer and use it in GitHub Desktop.
Benchmarking processing string of ids using Array vs Set
require 'benchmark/ips' # gem install benchmark-ips
require 'set'
def process_array(param)
ids = []
param.split(',').each do |id|
id = id.strip.to_i
ids << id if id != 0 && !ids.include?(id)
end
ids
end
def process_set(param)
ids = Set.new
param.split(',').each do |id|
id = id.strip.to_i
ids << id if id != 0
end
ids.to_a
end
def process_set_2(param)
ids = Set.new([0])
param.split(',').each do |id|
id = id.strip.to_i
ids << id
end
ids.delete(0)
ids.to_a
end
empty = ''
no_duplicates = '0,1,2,3,4,5,6,7,8,9,10'
with_duplicates = '0,1,2,1,3,4,2,2,2,5,6,7,7,8,9,10,11,0,3'
Benchmark.ips do |x|
x.report("array_empty") { process_array(empty) }
x.report("set_empty") { process_set(empty) }
x.report("set_2_empty") { process_set_2(empty) }
x.compare!
end
Benchmark.ips do |x|
x.report("array_no_duplicates") { process_array(no_duplicates) }
x.report("set_no_duplicates") { process_set(no_duplicates) }
x.report("set_2_no_duplicates") { process_set_2(no_duplicates) }
x.compare!
end
Benchmark.ips do |x|
x.report("array_with_duplicates") { process_array(with_duplicates) }
x.report("set_with_duplicates") { process_set(with_duplicates) }
x.report("set_2_with_duplicates") { process_set_2(with_duplicates) }
x.compare!
end
@vkmagalhaes
Copy link
Author

Warming up --------------------------------------
         array_empty   156.573k i/100ms
           set_empty    62.772k i/100ms
         set_2_empty    34.037k i/100ms
Calculating -------------------------------------
         array_empty      2.736M (± 5.8%) i/s -     13.778M in   5.053797s
           set_empty    848.897k (± 5.6%) i/s -      4.268M in   5.044250s
         set_2_empty    382.791k (± 7.2%) i/s -      1.906M in   5.007963s

Comparison:
         array_empty:  2735909.7 i/s
           set_empty:   848896.8 i/s - 3.22x  slower
         set_2_empty:   382791.2 i/s - 7.15x  slower

Warming up --------------------------------------
 array_no_duplicates    12.694k i/100ms
   set_no_duplicates    10.734k i/100ms
 set_2_no_duplicates     8.689k i/100ms
Calculating -------------------------------------
 array_no_duplicates    136.231k (± 5.6%) i/s -    685.476k in   5.048428s
   set_no_duplicates    117.251k (± 4.0%) i/s -    590.370k in   5.043094s
 set_2_no_duplicates     98.622k (± 5.1%) i/s -    495.273k in   5.036200s

Comparison:
 array_no_duplicates:   136231.0 i/s
   set_no_duplicates:   117251.4 i/s - 1.16x  slower
 set_2_no_duplicates:    98622.3 i/s - 1.38x  slower

Warming up --------------------------------------
array_with_duplicates
                         8.582k i/100ms
 set_with_duplicates     8.079k i/100ms
set_2_with_duplicates
                         7.076k i/100ms
Calculating -------------------------------------
array_with_duplicates
                         91.197k (± 4.5%) i/s -    463.428k in   5.092108s
 set_with_duplicates     82.324k (± 4.8%) i/s -    412.029k in   5.017411s
set_2_with_duplicates
                         72.992k (± 4.0%) i/s -    367.952k in   5.049162s

Comparison:
array_with_duplicates:    91197.2 i/s
 set_with_duplicates:    82324.0 i/s - 1.11x  slower
set_2_with_duplicates:    72991.9 i/s - 1.25x  slower

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