[#5322] O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...>
I just did some benchmarks on push, pop, shift, and unshift
On Fri, 1 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
On Sat, 2 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
On Sun, 3 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
Hi,
--- Yukihiro Matsumoto <matz@ruby-lang.org> wrote:
Hi,
Yukihiro Matsumoto wrote:
--- Florian Gro<florgro@gmail.com> wrote:
Eric Mahurin wrote:
--- Nikolai Weibull
Eric Mahurin wrote:
[#5388] Problem with socket communications on Windows — "Jim McMaster" <jim.mcmaster@...>
I recently installed PGP 9.0 on my Windows XP SP2 machine. At that point,
[#5391] Object#=~ — Ryan Davis <ryand-ruby@...>
Since Rexexp#=~ and String#=~ return nil if they fail to match,
Hi,
Hi,
--- Yukihiro Matsumoto <matz@ruby-lang.org> wrote:
[#5409] socket.c - s_recvfrom — Zach Dennis <zdennis@...>
If I am reading s_recvfrom correctly in can throw an error which kills
[#5420] Sydney Developer Preview 1 released — Evan Webb <evanwebb@...>
Sydney, an experimental ruby interpreter, has been released!
Thanks everyone for the feedback so far!
Hi,
The MD5 sum is 53d1bde4542365caf4849c56e6274617.
Hi,
On 7/12/05, nobuyoshi nakada <nobuyoshi.nakada@ge.com> wrote:
Hi,
Hello,
[#5445] GC tweak — Stefan Kaes <skaes@...>
I have found that the performance of current garbage collector
[#5451] bug in pstore (ruby 1.8.2) on Windows ( Win XP) ? — noreply@...
Bugs item #2101, was opened at 2005-07-14 15:30
[#5470] Bogus age value from Etc — Daniel Berger <Daniel.Berger@...>
Hi all,
[#5471] make fail; ruby v182 not finding readline ? — OpenMacNews <OpenMacNews@...>
hi all,
[#5476] Bug in ruby's command line parsing — Lothar Scholz <mailinglists@...>
Hello,
On Sat, Jul 16, 2005 at 10:11:34AM +0900, Lothar Scholz wrote:
[#5492] ruby ( v183) bcc32: using Socket.new with timeout -> files not closed — noreply@...
Bugs item #2131, was opened at 2005-07-19 17:34
O(1) performance for insertions/deletions at the front of an Array/String
I just did some benchmarks on push, pop, shift, and unshift
and/or various equivalents for both the Array and String
classes. I was using 100000 elements. Here are my findings:
1. push/pop and equivalents have O(1) performance as expected.
2. shift also has O(1) performance. I'm assuming that it
simply moves the start of array pointer by 1 instead of
shifting the data.
3. unshift has O(1) performance when you unshift no more than
the amount you have shifted. I'd assume it just decremented
the start of array pointer. When you unshift more than you
shifted, it is O(n), physically moving the data to the right.
4. all other equivalents to shift and unshift (slice!(0),
delete_at(0), insert(0,), [0,]=) have O(n) performance.
I have a couple applications where being able to quickly
insert/delete at the front and back of an Array/String would be
great.
Here are my suggestions to you core developers (the ones
responsible for Array/String at least):
a. at least make equivalents to shift (slice!(0), slice!(0,n)
delete_at(0), [0,n]=nil/[]/"") also O(1). In the String class
there is currently no fast equivalent to Array#shift.
b. make unshift (and equivalents in Array and String) always
O(1). This could be done my stretching the Array/String to the
left just like push (and equivalents) stretches the
Array/String to the right in memory.
c. if shifts/unshifts can be made just as fast as pushes/pops,
you could cut the average time in half for random insertions
and deletions. You could insert/delete toward the closest end
of the Array/String and on average move half the amount of
data. The closer you are to either end, the less data that
needs to be moved.
For reference, here is a ruby implementation showing how all 4
insert/delete operations at the ends can be made O(1). This
was pretty easy since shift is O(1). It would be a little more
difficult to implement this for a String right now.
class Array2
def initialize(after=[],before=[])
@after = after
@before = before
end
def push(*args)
@after.push(*args)
end
def pop
v = @after.pop
v.nil? && @after.empty? && (v = @before.shift)
v
end
def unshift(*args)
@before.push(*(args.reverse))
end
def shift
v = @before.pop
v.nil? && @before.empty? && (v = @after.shift)
v
end
end
__________________________________
Yahoo! Mail
Stay connected, organized, and protected. Take the tour:
http://tour.mail.yahoo.com/mailtour.html