Created
March 16, 2012 20:59
-
-
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 file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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? && [email protected]? | |
@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