RE: Sequence Slicing (Was RE: Tough ciphers?)

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

If I did my test correctly, and you're repetitively searching slices of 
a sequence, yes.

Because of your question, I did a bit of further testing. I've 
discovered, the turning point between the benefit of find() vs 
range_find() is somewhere between 200 to 300 elements.

At 300 elements, iterated 1000000/fl times, range_find() beats find() 
with 2.09 vs 2.58 consistently. The higher the number of elements, the 
larger the difference.

I haven't tested with nested sequences, or sequences with varied data.

Here are both complete tests:
<CONTROL TEST>
constant fl=300
integer fn
fn = open("words.txt","rb")

sequence temp     temp = repeat(0,fl)

for i = 1 to fl do
   temp[i] = getc(fn)
end for

close(fn)

atom t   t=time()
integer count  count = 0
integer f,found
for i = 1 to 10000000/fl do
f=1
found=find('\n',temp)
while found != 0 do
   count +=1
   f +=found
   found = find('\n',temp[f..length(temp)])
end while
end for

? f
? count
? time()-t
while get_key()=-1 do end while
<END CONTROL TEST>

<range_find() TEST>
constant fl = 300
integer fn
fn = open("words.txt","rb")

sequence temp     temp = repeat(0,fl)

for i = 1 to fl do
   temp[i] = getc(fn)
end for

close(fn)

function range_find(object x, sequence s, integer pos1, integer pos2)
 atom found
   found = 0
   while not found and pos1 <= pos2 do
      found = equal(x,s[pos1]) * pos1
      pos1 +=1
   end while
   return found
end function

atom t   t=time()
integer count  count = 0
integer f,found
for i =1 to 10000000/fl do
f=0
found=find('\n',temp)
while found != 0 do
   count +=1
   f =found+1
   found = range_find('\n',temp,f,length(temp))
end while
end for

? f
? count
? time()-t
while get_key()=-1 do end while
<END range_find() TEST>

Chris

Rod Jackson wrote:
> ???
> 
> Am I reading this right? Are you saying that this routine
> will actually find elements in a sequence faster than
> taking a slice of the sequence and using find() to search
> the slice?
> 
> Rod Jackson
> 
> 
> bensler at mail.com wrote:
> > This is fast and works on any slice of a sequence. Sanity checks could 
> > be added.
> > 
> > function range_find(object x, sequence s, integer pos1, integer pos2)
> >  atom found
> >    found = 0
> >    while not found and pos1 <= pos2 do
> >       found = equal(x,s[pos1]) * pos1
> >       pos1 +=1
> >    end while
> >    return found
> > end function
> > 
> > This is the test that I used. I wasn't concerned with accuracy, because 
> > the routine beats find() by a long shot.
> > 
> > <TEST>
> <snip>
> > <END TEST>
> > 
> > The control test used:
> > found = find('\n',temp[f..length(temp)]
> > 
> > instead of:
> > found = range_find('\n',temp,f,length(temp))
> 
>

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

Search



Quick Links

User menu

Not signed in.

Misc Menu