Entwickler-Ecke

Sonstiges (Delphi) - Schleifengeschwindigkeit


opfer.der.genauigkeit - Fr 23.05.03 16:56
Titel: Schleifengeschwindigkeit
Gibt es Geschwindigkeitsunterschiede bei:


Quelltext
1:
2:
 
for i := 0 to bla.count-1 do 'AUFRUF'


und


Quelltext
1:
2:
3:
for i := 0 to bla.count-1 do begin
  'AUFRUF'
end;


???

Wenn ja, wirkt sich das bei allen Sachen aus?
Also bei ner IF- Abfrage, Whileschleife, Hundekuchen ?


BungeeBug - Fr 23.05.03 17:13

Hi,
noe ... zumindest keinene Merkbaren ...


MfG BungeeBug


opfer.der.genauigkeit - Fr 23.05.03 17:18

Gut, daß man das als Mensch nich merkt hab ich auch beim Programmieren gemerkt. :wink:

Hat jemand vielleicht ne genaue Zahl?


AndyB - Fr 23.05.03 18:38

begin und end sind nur für den Compiler von Interesse, damit er weiß, wo ein Block beginnt und wo er aufhört. Im Maschinencode wirst du sie nicht wieder finden, womit keine Geschwindigkeitsunterschiede auftreten.


Quelltext
1:
for i := 0 to 10 do Something;                    

erzeugt Haar genau den selben Maschinencode wie

Quelltext
1:
2:
3:
4:
for i := 0 to 10 do
begin
  Something;
end;


UGrohne - Fr 23.05.03 18:47

Die Geschwindigkeit von Schleifen ist sowieso eine Sache für sich. Diese genau zu bestimmen ist eigentlich unmöglich und eine Schleife schneller zu machen ist genauso schwer.

Vor kurzem haben wir das Thema in Info durchgenommen und in Java die Laufzeit von 2 Schleifen gemessen. Komischerweise war irgendwann die 2. 5mal langsamer, als die erste, obwohl sie total gleich und völlig unabhängig voneinander waren. Hängst also auch vom Compiler ab, ob ein Code wirklich schnell ist.... :(


FriFra - Sa 24.05.03 10:27

Schleifen lassen sich schon "beschleunigen", wenn man bei bestimmten Aufgaben, wo man z.B. nur bis zu einem bestimmten Punkt durch die Schleife laufen muss "break" verwendet.


Klabautermann - Sa 24.05.03 13:03
Titel: Re: Schleifengeschwindigkeit
Hallo,

also wenn du Zahlschleifen beschleunigen willst, dann lasse sie rückwärts laufen. Da in Assembler nur auf 0 abgeprüft werden kann, muss bei hochzähleneden Schleifen auf das Ergebnis einer Rechnung die beim erreichren des Endwertes null ergibt geprüft werden muss.

Bei einfachen sachen wie z.B.

Delphi-Quelltext
1:
2:
for i := 0 to bla.count-1 do 
  Machwas;

Optimiert Delphi das von alleine so, dass die Schleife rückwärts läuft. Wenn aber in der Schleiffe auch die Zählvariable verwendet wird und Delphi somit nicht mehr entscheiden kann, ob ein ändern der Laufrichtung nicht die Funktion des Programmes beeinflusst, lässt es dir Finger davon.
Sofern es also möglich ist lasse deine Schleife in die andere Richtung laufen

Delphi-Quelltext
1:
2:
for i := bla.count-1 downto 0 do 
  Machwas;


Gruß
Klabautermann