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>