> >NO PROPERTY 0.295 >OBJECT.PROPERTY 0.249 >WITH .PROPERTY 0.250 >MEMVAR 0.002 > >NO PROPERTY 0.296 >OBJECT.PROPERTY 0.249 >WITH .PROPERTY 0.252 >MEMVAR 0.002 > >NO PROPERTY 0.294 >OBJECT.PROPERTY 0.250 >WITH .PROPERTY 0.251 >MEMVAR 0.001 >>
>*CLEAR > >*ERASE ("temp.txt") > >SET ALTERNATE TO temp.txt ADDITIVE >SET ALTERNATE ON > >CREATE CURSOR Test (Surname C(20)) > >lotest = CREATEOBJECT("empty") >addproperty(LOTEST,"membername","MCINTYRE") > >? > >A=SECONDS() >FOR X = 1 TO 100000 > LOCATE > LOCATE FOR UPPER(SURNAME)= "MCINTYRE" >ENDFOR X >?"NO PROPERTY",SECONDS()-M.A > >A=SECONDS() >FOR X = 1 TO 100000 > LOCATE > LOCATE FOR UPPER(SURNAME)= LOTEST.MEMBERNAME >ENDFOR X >?"OBJECT.PROPERTY",SECONDS()-M.A > >A=SECONDS() >WITH LOTEST > FOR X = 1 TO 100000 > LOCATE > LOCATE FOR UPPER(SURNAME)= .MEMBERNAME > ENDFOR X >ENDWITH >?"WITH .PROPERTY",SECONDS()-M.A > >A=SECONDS() >M.VAR = LOTEST.MEMBERNAME >FOR X = 1 TO 1000 > LOCATE > LOCATE FOR UPPER(SURNAME)= M.VAR >ENDFOR X >?"MEMVAR",SECONDS()-M.A > >SET ALTERNATE TO >SET ALTERNATE OFF >>>>Perhaps I should clarify what I meant by "implicit loop" -- the question was if the condition specified in the FOR clause would be evaluated multiple times (as if in a loop). In the worst case where the search can't be optimized, wouldn't it be equivalent to iterating sequentially through the list? If this is indeed the case then this might explain the apparent difference in speed between using memory variable and property of an object.
>>lotest = CREATEOBJECT("empty") >>addproperty(LOTEST,"membername","MCINTYRE") >> >>FOR x = 1 TO 100000 >>ENDFOR x >> >>A=SECONDS() >>FOR X = 1 TO 1000 >> LOCATE >> LOCATE FOR UPPER(SURNAME)= "MCINTYRE" >>ENDFOR X >>?"NO PROPERTY",SECONDS()-M.A >> >>A=SECONDS() >>FOR X = 1 TO 1000 >> LOCATE >> LOCATE FOR UPPER(SURNAME)= LOTEST.MEMBERNAME >>ENDFOR X >>?"OBJECT.PROPERTY",SECONDS()-M.A >> >>A=SECONDS() >>WITH LOTEST >> FOR X = 1 TO 1000 >> LOCATE >> LOCATE FOR UPPER(SURNAME)= .MEMBERNAME >> ENDFOR X >>ENDWITH >>?"WITH .PROPERTY",SECONDS()-M.A >> >>A=SECONDS() >>M.VAR = LOTEST.MEMBERNAME >>FOR X = 1 TO 1000 >> LOCATE >> LOCATE FOR UPPER(SURNAME)= M.VAR >>ENDFOR X >>?"MEMVAR",SECONDS()-M.A >>>