Skip to content

Instantly share code, notes, and snippets.

@algon-320
Created July 17, 2020 09:31
Show Gist options
  • Save algon-320/8f57187bdf88602e9b21c0fa4a1c04a9 to your computer and use it in GitHub Desktop.
Save algon-320/8f57187bdf88602e9b21c0fa4a1c04a9 to your computer and use it in GitHub Desktop.
$ ../install/bin/ruby ../test.rb
push / pop:
user system total real
Deque push 0.006660 0.000000 0.006660 ( 0.006663)
Array push 0.007511 0.000000 0.007511 ( 0.007562)
Deque pop 0.005977 0.000034 0.006011 ( 0.006018)
Array pop 0.006018 0.000000 0.006018 ( 0.006022)
Deque push (and write) 0.010819 0.000078 0.010897 ( 0.010912)
Array push (and write) 0.010133 0.000000 0.010133 ( 0.010138)
unshift / sfhit:
user system total real
Deque unshift 0.002545 0.003686 0.006231 ( 0.006237)
Array unshift 0.006667 0.000278 0.006945 ( 0.006951)
Deque shift 0.005625 0.000000 0.005625 ( 0.005631)
Array shift 0.006660 0.000027 0.006687 ( 0.006696)
Deque unshift (and write) 0.011488 0.000000 0.011488 ( 0.011490)
Array unshift (and write) 2.666406 0.000000 2.666406 ( 2.666451)
random access:
user system total real
Deque 0.007795 0.000000 0.007795 ( 0.007796)
Array 0.005829 0.000000 0.005829 ( 0.005832)
--------
small containers:
Calculating -------------------------------------
Deque 592.000 memsize ( 0.000 retained)
1.000 objects ( 0.000 retained)
0.000 strings ( 0.000 retained)
Array 120.000 memsize ( 0.000 retained)
1.000 objects ( 0.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Array: 120 allocated
Deque: 592 allocated - 4.93x more
large containers:
Calculating -------------------------------------
Deque 81.712k memsize ( 0.000 retained)
1.000 objects ( 0.000 retained)
0.000 strings ( 0.000 retained)
Array 80.040k memsize ( 0.000 retained)
1.000 objects ( 0.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Array: 80040 allocated
Deque: 81712 allocated - 1.02x more
push:
Calculating -------------------------------------
Deque 825.456k memsize ( 825.416k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 1.022M memsize ( 1.022M retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Deque: 825456 allocated
Array: 1021632 allocated - 1.24x more
unshift:
Calculating -------------------------------------
Deque 825.456k memsize ( 825.416k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 80.000 memsize ( 40.000 retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Array: 80 allocated
Deque: 825456 allocated - 10318.20x more
pop:
Calculating -------------------------------------
Deque 13.128k memsize ( 13.088k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 208.000 memsize ( 168.000 retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Array: 208 allocated
Deque: 13128 allocated - 63.12x more
shift:
Calculating -------------------------------------
Deque 13.128k memsize ( 13.088k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 80.000 memsize ( 40.000 retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Array: 80 allocated
Deque: 13128 allocated - 164.10x more
push and write:
Calculating -------------------------------------
Deque 825.456k memsize ( 825.416k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 634.440M memsize ( 1.022M retained)
199.913k objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Deque: 825456 allocated
Array: 634440456 allocated - 768.59x more
unshift and write:
Calculating -------------------------------------
Deque 825.456k memsize ( 825.416k retained)
2.000 objects ( 1.000 retained)
0.000 strings ( 0.000 retained)
Array 633.419M memsize ( 12.584k retained)
199.913k objects ( 2.000 retained)
0.000 strings ( 0.000 retained)
Comparison:
Deque: 825456 allocated
Array: 633418904 allocated - 767.36x more
require 'benchmark'
require "benchmark/memory"
N = 10 ** 5
puts
puts "push / pop:"
deq = Deque.new
ary = Array.new
Benchmark.bm { |x|
x.report("Deque push") { for i in 1..N do deq.push(i) end }
x.report("Array push") { for i in 1..N do ary.push(i) end }
x.report("Deque pop") { for i in 1..N do deq.pop end }
x.report("Array pop") { for i in 1..N do ary.pop end }
x.report("Deque push (and write)") { for i in 1..N do deq.push(i); deq[-1] *= 2 end }
x.report("Array push (and write)") { for i in 1..N do ary.push(i); ary[-1] *= 2 end }
}
puts
puts "unshift / sfhit:"
deq = Deque.new
ary = Array.new
Benchmark.bm { |x|
x.report("Deque unshift") { for i in 1..N do deq.unshift(i) end }
x.report("Array unshift") { for i in 1..N do ary.unshift(i) end }
x.report("Deque shift") { for i in 1..N do deq.shift end }
x.report("Array shift") { for i in 1..N do ary.shift end }
x.report("Deque unshift (and write)") { for i in 1..N do deq.unshift(i); deq[0] *= 2 end }
x.report("Array unshift (and write)") { for i in 1..N do ary.unshift(i); ary[0] *= 2 end }
}
puts
puts "random access:"
size = 10 ** 5
deq = Deque.new(size, 1)
ary = Array.new(size, 1)
idx = []
for i in 1..N do
idx.push(rand(size))
end
Benchmark.bm { |x|
x.report("Deque") { for i in idx do deq[i] end }
x.report("Array") { for i in idx do ary[i] end }
}
puts
puts "--------"
puts "small containers:"
Benchmark.memory { |x|
x.report("Deque") { Deque.new(10) }
x.report("Array") { Array.new(10) }
x.compare!
}
puts "large containers:"
Benchmark.memory { |x|
x.report("Deque") { Deque.new(10000) }
x.report("Array") { Array.new(10000) }
x.compare!
}
puts "push:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new
for i in 1..N do deq.push(i) end
}
x.report("Array") {
ary = Array.new
for i in 1..N do ary.push(i) end
}
x.compare!
}
puts "unshift:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new
for i in 1..N do deq.unshift(i) end
}
x.report("Array") {
ary = Array.new
for i in 1..N do ary.unshift(i) end
}
x.compare!
}
puts "pop:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new(N)
for i in 1..N do deq.pop end
}
x.report("Array") {
ary = Array.new(N)
for i in 1..N do ary.pop end
}
x.compare!
}
puts "shift:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new(N)
for i in 1..N do deq.shift end
}
x.report("Array") {
ary = Array.new(N)
for i in 1..N do ary.shift end
}
x.compare!
}
puts "push and write:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new
for i in 1..N do deq.push(i); deq[-1] *= 2 end
}
x.report("Array") {
ary = Array.new
for i in 1..N do ary.push(i); deq[-1] *= 2 end
}
x.compare!
}
puts "unshift and write:"
Benchmark.memory { |x|
x.report("Deque") {
deq = Deque.new
for i in 1..N do deq.unshift(i); deq[0] *= 2 end
}
x.report("Array") {
ary = Array.new
for i in 1..N do ary.unshift(i); deq[0] *= 2 end
}
x.compare!
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment