Skip to content

Instantly share code, notes, and snippets.

@funny-falcon
Created March 16, 2012 20:59
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 funny-falcon/2052650 to your computer and use it in GitHub Desktop.
Save funny-falcon/2052650 to your computer and use it in GitHub Desktop.
Arrays magic number 16 and queue or when ruby can be faster than ruby
# This notebook is on Atom N270 1.33GHz, so that I use only 500000 iterations
~/tmp/ruby$ ruby test_queue.rb 500000
Rehearsal -------------------------------------------------------------
pure man queue 2 0.570000 0.000000 0.570000 ( 0.574775)
pure man queue 4 0.550000 0.000000 0.550000 ( 0.557201)
pure man queue 15 0.600000 0.000000 0.600000 ( 0.599789)
pure man queue 16 1.620000 0.000000 1.620000 ( 1.615062)
pure man queue 48 1.720000 0.000000 1.720000 ( 1.729971)
pure man queue 128 2.130000 0.000000 2.130000 ( 2.136135)
pure ruby smart queue 4 1.170000 0.000000 1.170000 ( 1.166562)
pure ruby smart queue 15 1.190000 0.000000 1.190000 ( 1.196802)
pure ruby smart queue 16 1.330000 0.000000 1.330000 ( 1.336846)
pure ruby smart queue 48 1.440000 0.000000 1.440000 ( 1.439500)
pure ruby smart queue 128 1.480000 0.000000 1.480000 ( 1.505486)
compiled queue 4 0.730000 0.020000 0.750000 ( 0.744997)
compiled queue 15 0.780000 0.030000 0.810000 ( 0.900667)
compiled queue 16 0.780000 0.020000 0.800000 ( 0.830441)
compiled queue 48 0.840000 0.040000 0.880000 ( 0.946987)
compiled queue 128 0.800000 0.020000 0.820000 ( 0.845067)
--------------------------------------------------- total: 17.860000sec
user system total real
pure man queue 2 0.700000 0.000000 0.700000 ( 0.699771)
pure man queue 4 0.710000 0.010000 0.720000 ( 0.722799)
pure man queue 15 0.790000 0.000000 0.790000 ( 0.793402)
pure man queue 16 1.960000 0.000000 1.960000 ( 1.975780)
pure man queue 48 1.970000 0.000000 1.970000 ( 1.979116)
pure man queue 128 2.240000 0.000000 2.240000 ( 2.247744)
pure ruby smart queue 4 1.300000 0.000000 1.300000 ( 1.297341)
pure ruby smart queue 15 1.240000 0.000000 1.240000 ( 1.244382)
pure ruby smart queue 16 1.380000 0.000000 1.380000 ( 1.389162)
pure ruby smart queue 48 1.370000 0.010000 1.380000 ( 1.390153)
pure ruby smart queue 128 1.540000 0.000000 1.540000 ( 1.551731)
compiled queue 4 0.680000 0.010000 0.690000 ( 0.686393)
compiled queue 15 0.690000 0.010000 0.700000 ( 0.704052)
compiled queue 16 0.700000 0.010000 0.710000 ( 0.702106)
compiled queue 48 0.730000 0.020000 0.750000 ( 0.748439)
compiled queue 128 0.710000 0.020000 0.730000 ( 0.732491)
~/tmp/ruby$ ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [i686-linux]
require 'benchmark'
# https://github.com/kanwei/algorithms
require 'algorithms'
N = (ARGV[0] || 1000000).to_i
def test(a)
N.times{|i| a.shift; a.push i}
end
# Array - is a pure man queue
def ar(n)
[1] * n
end
# Consider Array bad magic number "16"
class Deque
def initialize(enum)
@cont = enum.each_slice(15).to_a
unless @cont.empty?
@first = @cont.shift
else
@first = []
end
unless @cont.empty?
@last = @cont.last
else
@last = @first
end
end
def push(v)
last = @last
if last.size == 15
@cont << (@last = [v])
else
last << v
end
end
def shift
first = @first
v = first.shift
if first.empty? && !@cont.empty?
@first = @cont.shift
end
v
end
end
def deq(n)
Deque.new(ar(n))
end
# use compilled queue
class Containers::CDeque
alias shift pop_front
alias push push_back
end
def adeq(n)
Containers::CDeque.new(ar(n))
end
Benchmark.bmbm(6) do |x|
x.report('pure man queue 2'){ test(ar(2)) }
x.report('pure man queue 4'){ test(ar(4)) }
x.report('pure man queue 15'){ test(ar(15)) }
x.report('pure man queue 16'){ test(ar(16)) }
x.report('pure man queue 48'){ test(ar(48)) }
x.report('pure man queue 128'){ test(ar(128)) }
x.report('pure ruby smart queue 4'){ test(deq(4)) }
x.report('pure ruby smart queue 15'){ test(deq(15)) }
x.report('pure ruby smart queue 16'){ test(deq(16)) }
x.report('pure ruby smart queue 48'){ test(deq(48)) }
x.report('pure ruby smart queue 128'){ test(deq(128)) }
x.report('compiled queue 4'){ test(adeq(4)) }
x.report('compiled queue 15'){ test(adeq(15)) }
x.report('compiled queue 16'){ test(adeq(16)) }
x.report('compiled queue 48'){ test(adeq(48)) }
x.report('compiled queue 128'){ test(adeq(128)) }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment