Welcome To The Home Of The Visual FoxPro Experts  
home. signup. forum. archives. search. google. articles. downloads. faq. members. weblogs. file info. rss.
 From: Vilhelm-Ion Praisach
  Where is Vilhelm-Ion Praisach?
 Resita
 Romania
 Vilhelm-Ion Praisach
 To: Pete Sass
  Where is Pete Sass?
 Marathon, Ontario
 Canada
 Pete Sass
 Tags
Subject: RE: C++ compiler
Thread ID: 415740 Message ID: 416154 # Views: 35 # Ratings: 0
Version: Visual FoxPro 9 SP2 Category: 3rd Party Software
Date: Monday, December 22, 2014 5:54:52 PM         
   


> >
> > Gentlemen, you're forgetting a very significant part of the experiment. You must set a filter and/or you must have a large number of deleted records at the physical top and/or bottom of the table with set deleted on.
> >
> > In that situation - which many people have making it a real-world test - you will see that GO TOP/BOTTOM is un-optimized and therefore takes a very long time versus LOCATE. I'm not sure where LOCATE = .F. came from. That is a typo. It must be LOCATE FOR .F.
> >
> > The experiment was presented in my first FoxPro Advisor article back in 1995.
> >
> > Mike Yearwood
> > Microsoft MVP Visual FoxPro 2008, 2009
> > We have enough youth. We need a fountain of smart!
> > There may be many ways to skin a cat, but there are very few right ways to do it.
>
>
>
> Hi Mike,
>
> I wondered about the locate and have for some time now.
> So what this boils down to if I create a cursor/table from scratch the test does not
> show up the improved speed when using locate, but in a real-world situation knowing
> there will be deleted records unless a pack was just done, there is where the locate
> is going to shine!
>
> Did I get this right?
>
> My mistake the LOCATE = .F. is a typo that I have in one of the routine in error - booo hoo!
>
>
> Pete "the IceMan", from the Great White North of Canada.
> www.marathongriffincomputers.com

I managed to get a small advantage for Locate versus Go top, but Locate for .F. was always several times slower than Go Bottom.
Since the test original was made in 1995, maybe VFP9 take it into account and improved the Go top / Go bottom commands ?
Useful for me this thread.

LOCAL lnmult,cc[4],lni,lnRecno,ttt,lnRec,lSetTalk,lSetDeleted
CLEAR
CLOSE DATABASES ALL
RAND(-1)
lSetTalk = SET("Talk")
lSetDeleted = SET("Deleted")
SET DELETED ON
SET TALK OFF
lnRecno = 100
FOR lnmult = 1 TO 3 && 4 && 5
	cc[m.lnmult] = SYS(2015)
	CREATE TABLE (cc[m.lnmult]) (ii I,cc C(10))

*!*		INDEX on cc TAG cc DESCENDING
*!*		SET ORDER TO cc

	lnRecno = m.lnRecno * 10 && 1000, 10000, 100000, 1000000, 10000000
	?
	? ' cursor with ' + TRANSFORM(m.lnRecno) + 'rows'
	FOR lni = 1 TO m.lnRecno 
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
		DELETE
	NEXT
	FOR lni = 1 TO m.lnRecno
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
	NEXT
	FOR lni = 1 TO m.lnRecno 
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
		DELETE
	NEXT
	FOR lni = 1 TO m.lnRecno
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
		DELETE
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
	NEXT
	FOR lni = 1 TO m.lnRecno 
		INSERT INTO (cc[m.lnmult]) VALUES (INT(m.lnRecno * RAND()),SYS(2015))
		DELETE
	NEXT
*!*	SET FILTER TO ii % 13 <> 0
	
	? "1000 go bottom, step " + TRANSFORM(10 ^(m.lnmult-1))
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(m.lnRec * 10 ^(m.lnmult-1),1)
		GO BOTTOM 
	NEXT
	? SECONDS() - ttt
	
	? "1000 locate .F., step " + TRANSFORM(10 ^(m.lnmult-1))
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(m.lnRec * 10 ^(m.lnmult-1),1)
		LOCATE FOR .F.
	NEXT
	? SECONDS() - ttt

	? "1000 go bottom, random"
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(INT(m.lnRecno * RAND()),1)
		GO BOTTOM 
	NEXT
	? SECONDS() - ttt
	
	? "1000 locate .F., random"
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(INT(m.lnRecno * RAND()),1)
		LOCATE FOR .F.
	NEXT
	? SECONDS() - ttt

	FOR lni = 1 TO m.lnRecno
		APPEND BLANK
	NEXT
	? "1000 go top, step " + TRANSFORM(10 ^(m.lnmult-1))
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO m.lnRec * 10 ^(m.lnmult-1)
		GO TOP
	NEXT
	? SECONDS() - ttt
	
	? "1000 locate, step " + TRANSFORM(10 ^(m.lnmult-1))
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO m.lnRec * 10 ^(m.lnmult-1)
		LOCATE 
	NEXT
	? SECONDS() - ttt

	? "1000 go top, random"
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(INT(m.lnRecno * RAND()),1)
		GO TOP 
	NEXT
	? SECONDS() - ttt
	
	? "1000 locate, random"
	ttt = SECONDS()
	FOR lnRec = 1 TO 1000
		GO MAX(INT(m.lnRecno * RAND()),1)
		LOCATE
	NEXT
	? SECONDS() - ttt
NEXT

SET TALK &lSetTalk
SET DELETED &lSetDeleted



Respectfully

ENTIRE THREAD

C++ compiler Posted by Mike Yearwood @ 12/11/2014 9:47:42 PM
RE: C++ compiler Posted by Tony Vignone @ 12/11/2014 10:18:16 PM
RE: C++ compiler Posted by michael johnson @ 12/12/2014 3:15:14 AM
RE: C++ compiler Posted by Mike Yearwood @ 12/12/2014 4:40:18 PM
RE: C++ compiler Posted by Chuanbing Chen @ 12/12/2014 8:01:24 AM
RE: C++ compiler Posted by Pete Sass @ 12/12/2014 12:41:53 PM
RE: C++ compiler Posted by Pete Sass @ 12/13/2014 5:29:47 PM
RE: C++ compiler Posted by Tony Vignone @ 12/13/2014 8:27:53 PM
RE: C++ compiler Posted by Chuanbing Chen @ 12/14/2014 3:44:09 AM
RE: C++ compiler Posted by Mike Yearwood @ 12/15/2014 4:02:35 PM
RE: C++ compiler Posted by Tony Vignone @ 12/16/2014 2:10:42 PM
RE: C++ compiler Posted by Mike Yearwood @ 12/16/2014 6:00:18 PM
RE: C++ compiler Posted by Tony Vignone @ 12/16/2014 7:37:14 PM
RE: C++ compiler Posted by Pete Sass @ 12/17/2014 3:27:15 AM
RE: C++ compiler Posted by Mike Yearwood @ 12/17/2014 3:50:23 PM
RE: C++ compiler Posted by Pete Sass @ 12/17/2014 6:09:24 PM
RE: C++ compiler Posted by Mike Yearwood @ 12/18/2014 3:22:37 PM
RE: C++ compiler Posted by Pete Sass @ 12/18/2014 4:55:58 PM
RE: C++ compiler Posted by Mike Yearwood @ 12/18/2014 7:16:44 PM
RE: C++ compiler Posted by Pete Sass @ 12/18/2014 7:53:51 PM
RE: C++ compiler Posted by Chuanbing Chen @ 12/19/2014 12:48:30 AM
RE: C++ compiler Posted by Pete Sass @ 12/19/2014 11:57:43 PM
RE: C++ compiler Posted by Mike Gagnon @ 12/20/2014 2:09:13 AM
RE: C++ compiler Posted by Pete Sass @ 12/20/2014 3:18:09 PM
RE: C++ compiler Posted by Vilhelm-Ion Praisach @ 12/20/2014 6:53:41 PM
RE: C++ compiler Posted by Pete Sass @ 12/20/2014 8:25:14 PM
RE: C++ compiler Posted by Vilhelm-Ion Praisach @ 12/20/2014 9:18:10 PM
RE: C++ compiler Posted by Mike Yearwood @ 12/22/2014 3:01:11 PM
RE: C++ compiler Posted by Pete Sass @ 12/22/2014 3:57:28 PM
RE: C++ compiler Posted by Vilhelm-Ion Praisach @ 12/22/2014 5:54:52 PM
RE: C++ compiler Posted by Mike Yearwood @ 12/22/2014 9:38:06 PM
RE: C++ compiler Posted by Chuanbing Chen @ 12/23/2014 1:03:49 AM
RE: C++ compiler Posted by Mike Yearwood @ 12/22/2014 3:42:43 PM