RE: Sequence Slicing (Was RE: Tough ciphers?)
- Posted by bensler at mail.com Mar 15, 2002
- 409 views
I just made range_find() even faster. They even out at 100 elements now, clocking at 1.27 secs. More than 100 elements, and range_find() has the benefit. Here it is: function range_find(object x, sequence s, integer pos1, integer pos2) integer pos pos = pos1 while pos <= pos2 do if equal(x,s[pos]) then exit end if pos +=1 end while if pos > pos2 then return 0 elsif pos = pos1 then return 0 else return pos end if end function Chris bensler at mail.com wrote: > I should point out, that using sequences of length < 200, range_find() > is drastically slower. Using 200 elements or less, range_find() clocks > in at 2 seconds. It doesn't seem to drop less than 2 secs. > fastest time I got for find() was 0.68 using 10 elements. > > Chris > > bensler at mail.com wrote: > > 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: > > > ??? <snip>