Frage zu RushMore usw.

17/02/2009 - 15:39 von Winfried Wolf | Report spam
Hallo,
mir ist das Zeitverhalten von VFP-Routinen manchmal sehr unverstàndlich.
Einen Fall aus meiner realen Programmierer-Welt hab ich mal als
Modellfall nachgestellt. Das Programm sieht so aus:

WAIT WINDOW NOWAIT "START"
SET COLLATE TO "MACHINE"
SET OPTIMIZE ON
CREATE CURSOR testdata (field1 C(8), field2 C(4))
FOR i=1 TO 100000
INSERT INTO testdata VALUES (STR(i,8),STR(MOD(i,10000),4))
ENDFOR
INDEX ON field1 TAG field1 COMPACT
INDEX ON field2 TAG field2 ADDITIVE
SET ORDER TO field1
SET FILTER TO field2=='9999'
WAIT WINDOW NOWAIT "MESSUNG"
nTime1=SECONDS()
FOR i=1 TO 10000
ii=STR(i,8)
[BEFEHL]
ENDFOR && i
nTime2=SECONDS()
WAIT WINDOW "Zeit="+STR(m.nTime2-m.nTime1,6,2)
USE IN testdata
RETURN

Für [BEFEHL] hab ich nacheinander eingesetzt:

=INDEXSEEK(m.ii,.F.,'testdata','field1') && 1

=INDEXSEEK(m.ii,.T.,'testdata','field1') && 2

=SEEK(m.ii,'testdata') && 3

LOCATE FOR field1=m.ii && 4

SELECT * FROM testdata ;
WHERE field1==m.ii AND field2=='9999' ;
INTO ARRAY aaa && 5


Die Messzeiten dabei sind:
1: 0.03 Sek.
2: 35 Sek.
3: 35 Sek.
4: 91 Sek.
5: 1.34 Sek.

Diese großen Unterschiede sind mir unerklàrlich; sollte nicht alles
Rushmore-optimiert sein?

Noch extremer waren die Ergebnisse in dem ursprünglichen Fall mit
"echten" Daten. Dort hatte ich beim Vergleich der 5 Befehle folgendes
Ergebnis:
1: 0.00 Sek.
2: abgebrochen nach ca. 10 Minuten
3: abgebrochen nach ca. 10 Minuten
4: 58 Sek. (also deutlich schneller als 2 und 3)
5: 0,41 Sek.

Welche Erklàrung gibt es dafür?

Gruß,
WiWo
 

Lesen sie die antworten

#1 Dag Westerkamp
17/02/2009 - 23:27 | Warnen spam
Hallo Winfried,

also erstens haben die IndexSeek() und Seek() funktionen nichts mit Rushmore zu tun und zweitens ist der, eigentlich überflüssige, Filter schuld an den enormen Unterschieden.
Lass den Filter mal weg und du wirst dich wundern, wie schnell das alles gehen kann.
Der Filter schlàgt nàmlich immer dann zu Buche, wenn der Satzzeiger in der Tabelle bewegt werden muss und genau das ist bei den Beispielen 2,3 und 4 der Fall.


Winfried Wolf schrieb:
Hallo,
mir ist das Zeitverhalten von VFP-Routinen manchmal sehr unverstàndlich.
Einen Fall aus meiner realen Programmierer-Welt hab ich mal als
Modellfall nachgestellt. Das Programm sieht so aus:

WAIT WINDOW NOWAIT "START"
SET COLLATE TO "MACHINE"
SET OPTIMIZE ON
CREATE CURSOR testdata (field1 C(8), field2 C(4))
FOR i=1 TO 100000
INSERT INTO testdata VALUES (STR(i,8),STR(MOD(i,10000),4))
ENDFOR
INDEX ON field1 TAG field1 COMPACT
INDEX ON field2 TAG field2 ADDITIVE
SET ORDER TO field1
SET FILTER TO field2=='9999'
WAIT WINDOW NOWAIT "MESSUNG"
nTime1=SECONDS()
FOR i=1 TO 10000
ii=STR(i,8)
[BEFEHL]
ENDFOR && i
nTime2=SECONDS()
WAIT WINDOW "Zeit="+STR(m.nTime2-m.nTime1,6,2)
USE IN testdata
RETURN

Für [BEFEHL] hab ich nacheinander eingesetzt:

=INDEXSEEK(m.ii,.F.,'testdata','field1') && 1

=INDEXSEEK(m.ii,.T.,'testdata','field1') && 2

=SEEK(m.ii,'testdata') && 3

LOCATE FOR field1=m.ii && 4

SELECT * FROM testdata ;
WHERE field1==m.ii AND field2=='9999' ;
INTO ARRAY aaa && 5


Die Messzeiten dabei sind:
1: 0.03 Sek.
2: 35 Sek.
3: 35 Sek.
4: 91 Sek.
5: 1.34 Sek.

Diese großen Unterschiede sind mir unerklàrlich; sollte nicht alles
Rushmore-optimiert sein?

Noch extremer waren die Ergebnisse in dem ursprünglichen Fall mit
"echten" Daten. Dort hatte ich beim Vergleich der 5 Befehle folgendes
Ergebnis:
1: 0.00 Sek.
2: abgebrochen nach ca. 10 Minuten
3: abgebrochen nach ca. 10 Minuten
4: 58 Sek. (also deutlich schneller als 2 und 3)
5: 0,41 Sek.

Welche Erklàrung gibt es dafür?

Gruß,
WiWo

Ähnliche fragen