Re: reverse() function, was:Re: Win32Lib Update

new topic     » goto parent     » topic index » view thread      » older message » newer message

-- Here are your (Ralf & Hawke's) versions, plus a couple of other
-- ways off the top of my head, timed:

sequence before, after, start, fini

before = "Now is the time for all good men to come get drunk at the party."

function Reverse1 (sequence s) -- 7 seconds for 100,000 iterations
sequence r
 r = {}
 for i = 1 to length(s) do
    r = prepend(r,s[i])
 end for
return r
end function

function Reverse2(sequence data) -- 4 seconds for 100,000 its.
sequence result
integer len, from
   len    = length(data)
   from   = len --i really could reuse len....
   result = repeat(0,len) --BOOM, call alloc *once*
   for toindex = 1 to len do
        result[toindex] = data[from]
        from = from - 1 --and this takes 1 single tick...
   end for
   return result
end function

function Reverse3 (sequence s) -- 6 seconds for 100,000 its.
atom temp, left, right
left = 1
right = length(s)
while left < right do
  temp = s[left]
  s[left] = s[right]
  s[right] = temp
  left = left + 1
  right = right - 1
end while
return s
end function

function Reverse4 (sequence s) -- 5 seconds
atom x
sequence r
x = length(s)
r = repeat(0,x)
for i = 1 to x do
   r[i] = s[x-i+1]
end for
return r
end function

start = date()
for i = 1 to 100000 do
after = Reverse4(before) -- change the nuber to test other functions
end for
fini = date()
printf(1,"Start: %02d:%02d:%02d\n",{start[4],start[5],start[6]})
printf(1,"Fini:  %02d:%02d:%02d\n",{fini[4],fini[5],fini[6]})
puts(1,after)

-- I feel sure there is a faster way. Any takers?
-- Irv

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu