[Gelöst]REPEAT extrem langsam

19. Mai 2009 12:37

Hallo alle!

Es ist zum Verzweifeln...
I laufe einen gefilterten Record mit dem REPEAT-Konstrukt durch.
Und ich habe versucht, herauszufinden, warum mein code so langsam ist.
Der Code innerhalb des REPEAT-Konstrukts an sich ist nicht langsam - ein Durchlauf dauert zw. 0 und 31 Millisekunden.
Es sieht so aus:

REPEAT;
// mein Code ->> zw. 0 und 31 Millisekunden
UNTIL myRecordVar.NEXT = 0; // ->> jew. mehr als 10 Millisekunden

zB: Wenn ich die Zeit messe von vor REPEAT bis nach UNTIL, dauert das 971 Millisekunden; wenn ich dagegen the Zeit messe von nach REPEAT bis vor UNTIL und die Zeiten der einzelnen Durchläufe summiere, erhalte ich 124 Millisekunden. Das heißt, dass von den 971 Millisekunden 847 Millisekunden nicht für die Verarbeitung des Codes innerhalb des REPEAT-Konstrukts aufgeht. REPEAT läuft 77 mal durch. Das macht 11 Millisekunden pro Durchlauf.

Was kann REPEAT derart bremsen?!

Vielen Dank schon mal für eure Hilfe!
Gerald
Zuletzt geändert von BadGer am 22. Mai 2009 09:23, insgesamt 1-mal geändert.

Re: REPEAT extrem langsam

19. Mai 2009 12:48

Ich rat mal: was für ein find steht da denn vor (-,+,first,set etc)?

Re: REPEAT extrem langsam

19. Mai 2009 13:16

Sorry - genau:
Ich habe eine native DB und verwende FIND('-')

Re: REPEAT extrem langsam

19. Mai 2009 13:29

Schade, ich hatte auf ein findfirst gehofft :wink:

Greift der Code innerhalb der Schleife derart auf dein Recordset zu, dass die Reihenfolge darin geändert wird?

Re: REPEAT extrem langsam

19. Mai 2009 13:32

nein, ich verarbeite nur die Feldwerte

Re: REPEAT extrem langsam

19. Mai 2009 13:37

Dann gehen mir so langsam die Ideen aus. Ist ein passender Schlüssel gesetzt?

Re: REPEAT extrem langsam

19. Mai 2009 13:40

Vielleicht helfen ja ein paar mehr Zeilen Code im Thread, am besten hübsch in CODE-Tags verpackt.

Re: REPEAT extrem langsam

19. Mai 2009 13:42

@McClane:
Woher weiß ich, was ein "passender" Schlüssel ist?
Außerdem, wie hängt das mit einem Schlüssel zusammen? Ich gehe mit NEXT ja nur von einem Datensatz zum nächsten, oder?

@FAFL:
Was möchtest du gerne wissen?
Die Zeit für die SETRANGEs ist gleich 0 Millisekunden.
Der Code innerhalb des REPEAT braucht fast keine Zeit.
Mit über 10 Millisekunden pro Durchlauf ist nur die REPEAT-Schleife selbst extrem langsam, bzw. das NEXT.

Re: REPEAT extrem langsam

19. Mai 2009 13:46

Mit einem passenden Schlüssel meinte ich einen, der zu deinen SetRanges passt (insofern da welche sind ;), also möglichst einen, der alle eingegrenzten Felder enthält.

Re: REPEAT extrem langsam

19. Mai 2009 13:48

Achso, ja - den habe ich so gewählt.

Re: REPEAT extrem langsam

19. Mai 2009 13:49

BadGer hat geschrieben:@FAFL:
Was möchtest du gerne wissen?
Die Zeit für die SETRANGEs ist gleich 0 Millisekunden.


Das ist ja auch völlig klar, denn da passiert ja noch garnichts, die Abfrage beginnt ja erst mit dem FIND. Dennoch können die Filter und insbesondere der Schlüssel interessant sein.

BadGer hat geschrieben:Der Code innerhalb des REPEAT braucht fast keine Zeit.
Mit über 10 Millisekunden pro Durchlauf ist nur die REPEAT-Schleife selbst extrem langsam, bzw. das NEXT.

... interessiert mich dann auch erstmal nicht.

Re: REPEAT extrem langsam

19. Mai 2009 14:06

Ich habe nur "gewöhnliche" Filter auf Boolean- und Option-Felder.
Außer den hier:
myRecordVar.SETRANGE("Manuf. Date",0D,ToDate);
'ToDate' ist eine Variable die ein Datum enthält.
Kann das wirklich so bremsen?

Auch ist kein Filter auf ein FlowField dabei. Das hätte wohl nach einem CALCFIELDS keine Auswirkung mehr, oder?

Re: REPEAT extrem langsam

19. Mai 2009 14:19

Wie sieht´s denn mit der Reihenfolge der SetRanges aus - entsprechen die der Reihenfolge der Felder im gewählten Schlüssel?

Re: REPEAT extrem langsam

19. Mai 2009 14:48

Die Reihenfolge hat nicht übereingestimmt.
Allerdings wird alles noch langsamer, wenn die Reihenfolge übereinstimmt :roll: eigenartig...

Re: REPEAT extrem langsam

19. Mai 2009 14:51

BadGer hat geschrieben:Allerdings wird alles noch langsamer, wenn die Reihenfolge übereinstimmt eigenartig...

Wo man das doch beachten soll :mrgreen:

Wie kommst du eigentlich an die Zeitangaben?

Re: REPEAT extrem langsam

19. Mai 2009 14:52

Hi!

Wie die Kollegen schon sagten: ein paar Zeilen mehr vom Code wären hilfreich; insbesondere welcher KEY und welche FILTER vor dem Schleifeneinstieg gesetzt sind. Wichtig wäre auch zu wissen, ob/welche Werte der Instanz "MyRecordVar" innerhalb der Schleife geändert werden ...

Gruß,
Jörg

Re: REPEAT extrem langsam

19. Mai 2009 14:55

Geändert wird in myRecordVar nichts, es werden nur die Daten verarbeitet.

Code:
myRecordVar.SETCURRENTKEY(Art,"Nr.",Bereich,Belegart,Finished,ReleasedForPurchaseRequest,"Manuf. Date");
myRecordVar.SETRANGE(Bereich,myRecordVar.Bereich::Verkauf);
myRecordVar.SETRANGE(Belegart,myRecordVar.Belegart::Auftrag);
myRecordVar.SETRANGE(Art,myRecordVar.Art::Artikel);
myRecordVar.SETRANGE("Nr.",prcItem."No.");
myRecordVar.SETRANGE(Finished,FALSE);
myRecordVar.SETRANGE(ReleasedForPurchaseRequest,TRUE);
myRecordVar.SETRANGE("Manuf. Date",0D,ToDate);
IF myRecordVar.FIND('-') THEN BEGIN

Re: REPEAT extrem langsam

19. Mai 2009 14:59

McClane hat geschrieben:Wo man das doch beachten soll :mrgreen:

Was meinst du damit?

McClane hat geschrieben:Wie kommst du eigentlich an die Zeitangaben?

Ich habe mir eine einfache Stopuhr gebaut, die ich an einer beliebigen Codestelle starte und an einer anderen stoppe. Die Differenz wird als Duration in eine Tabelle geschrieben.
Völlig "zeitunkritisch". Und sehr praktisch!

Re: REPEAT extrem langsam

19. Mai 2009 15:04

Hmmm ... und das wird langsamer, wenn man die Filter in der Reihenfolge setzt, wie die Felder im Key angeordnet sind? Seltsam ...

Wie sieht's denn auf den Festplatten aus? Wie sind Durchsatz und Antwortzeiten? (Mit Windows perfmon messen)
Was für ein Disk-Subsystem läuft da?

Und: wie groß ist der DBMS Cache? Commit Cache aktiv? Wie viele Datensätze werden in der Abfrage abgefiltert?

Re: REPEAT extrem langsam

19. Mai 2009 15:16

stryk hat geschrieben:Wie sieht's denn auf den Festplatten aus? Wie sind Durchsatz und Antwortzeiten? (Mit Windows perfmon messen)
Was für ein Disk-Subsystem läuft da?

Ich habe keine Ahnung...

stryk hat geschrieben:Und: wie groß ist der DBMS Cache? Commit Cache aktiv? Wie viele Datensätze werden in der Abfrage abgefiltert?

DBMS: 8000 KB
Commit Cache: aktiv

Re: REPEAT extrem langsam

19. Mai 2009 15:19

BadGer hat geschrieben:DBMS: 8000 KB
Commit Cache: aktiv


Ist das der DBMS-Cache des Servers? (Datei -> Datenbank -> Information -> Reiter "Datenbank"). Wenn ja, dann ist die Sache sonnenklar.

Re: REPEAT extrem langsam

19. Mai 2009 15:20

@FAFL:
Ja
Das heißt?
Zuletzt geändert von BadGer am 19. Mai 2009 15:23, insgesamt 2-mal geändert.

Re: REPEAT extrem langsam

19. Mai 2009 15:22

Bin gerade draufgekommen, dass ich im falschen Forum gepostet habe:
Ich arbeite mit Version 4.0 SP3
Tut mir leid!
Kann man das ändern?

Re: REPEAT extrem langsam

19. Mai 2009 15:25

Du wunderst dich doch nicht wirklich, dass du mit angezogener Handbremse nicht schnell fahren kannst, oder?

Ok, kann natürlich sein, dass in deiner Tabelle nur 77 Datensätze drin stehen, dann spielt der DBMS-Cache fast keine Rolle, aber wenn da ein paar Tausend Datensätze drin stehen, dann solltest du dich nicht wundern.

Re: REPEAT extrem langsam

19. Mai 2009 15:27

Da sind hunderttausende Datensätze drin :wink:
Welche Größe sollte der DBMS Chache haben?
Und dass das NEXT so langsam ist, kann damit zusammenhängen?