Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Slow LOCATE command in _Assign method
Message
De
13/05/2010 10:58:30
Mike Yearwood
Toronto, Ontario, Canada
 
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Autre
Versions des environnements
Visual FoxPro:
VFP 9 SP1
OS:
Windows 7
Database:
Visual FoxPro
Divers
Thread ID:
01463679
Message ID:
01464408
Vues:
32
I only have 1619 records in the table I used.

I just ran it now and got
NO PROPERTY 0.088
OBJECT.PROPERTY 0.115
WITH .PROPERTY 0.662
MEMVAR 0.034

Doesn't matter. Memvar is THE way to go.

>That's not what I see in my tests
>1. No difference between WITH and direct property access
>2. No difference between the first and subsequent runs
>
>
>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.
>>>
>>>>LOCATE has nothing to do with loops. It simply finds the first matching record.
>>>>
>>>>>Is there an implict loop with LOCATE?
>>
>>His search was optimized. Normally there is a slight difference between a Of course there has to be looping code - inside VFP - to iterate through the filtered records. There is also 'looping' code to iterate the class hierarchy for the object.property. This secondary loop is supposed to be short-circuited by WITH and it is also short-circuited by first assigning the property to a memory variable.
>>
>>The differences are small, but suggest the internal operations. This code:
>
>>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
>
>>
>>Gives the following output
>>
>>NO PROPERTY 0.162
>>OBJECT.PROPERTY 0.115
>>WITH .PROPERTY 0.691
>>MEMVAR 0.051
>>
>>Second run:
>>NO PROPERTY 0.088
>>OBJECT.PROPERTY 0.055
>>WITH .PROPERTY 0.720
>>MEMVAR 0.050
>>
>>Notice that the object approaches are not even close to each other in either run. I'm surprised that the WITH is so much slower. I'm happy the memvar beats the literal, how often do we get to search for a literal?
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform