Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Achtung. Optimierung beim Compiler (https://www.delphipraxis.net/152027-achtung-optimierung-beim-compiler.html)

himitsu 10. Jun 2010 17:16

AW: Achtung. Optimierung beim Compiler
 
Dieses wurde doch garnicht bezweifelt?

Es wurde nur gesagt, daß die "Optimierung" das Programm-Verhalten nicht verändert,
wie du es (so klingt es zumindestens) ständig behauptest.
Und das ist bisher nirgendwo nachgewiesen wurden.

Fazit:
- intern kann sich die Zählreihenfolge mal verändern
- aber dennoch wird an der Arbeitsweise und dem Ergebnis des Programms nix verändert.


PS: Diese Optimierung muß nichtmal nur rückwärts zählen.

zählt von 6 auf 0 runter:
(natürlich nur in diesem Beispiel und mit Optimierung halbwegs garantiert)
Delphi-Quellcode:
var i, j: Integer;
begin
for i := 5 to 10 do
  inc(j);
if j = 0 then ; // damit j nicht wegoptimiert wird
end;
zählt von -6 auf 0 rauf:
Delphi-Quellcode:
var i, j: Integer;
begin
for i := 10 downto 5 do
  inc(j);
if j = 0 then ;
end;
Und falls deine Schleifenvariable nach der Schleife einen "unerwarteten" Wert aufweist ... daran bist'e selbser Schuld, da eine Schleifenvariable nur innerhalb der Schleife gültig ist, welches der Compiler (wie auch schon erwähnt wurde) melden sollte.

uligerhardt 10. Jun 2010 17:29

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von himitsu (Beitrag 1027906)
Dieses wurde doch garnicht bezweifelt?

Es wurde nur gesagt, daß die "Optimierung" das Programm-Verhalten nicht verändert,
wie du es (so klingt es zumindestens) ständig behauptest.
Und das ist bisher nirgendwo nachgewiesen wurden.

Fazit:
- intern kann sich die Zählreihenfolge mal verändern
- aber dennoch wird an der Arbeitsweise und dem Ergebnis des Programms nix verändert.

Danke. Du hast das irgendwie prägnanter formuliert als ich. :-)

Assertor 10. Jun 2010 17:40

AW: Achtung. Optimierung beim Compiler
 
Hallo,

Zitat:

Zitat von DelTurbo (Beitrag 1027900)
i ist im weiteren verlauf mein index auf ein anderes Array.

p80286 und himitsu haben absolut recht: Der Wert der Schleifenvariable ist nach der Schleife nicht garantiert, egal was Du machst. Um die Eingangsfrage zu beantworten: Ja, das Verhalten ist bekannt.

Die Herren Nick Hodges, Allen Bauer und Primoz Gabrijelcic schreiben es bei StackOverflow so:

Zitat:

That is correct. The variable is specifically documented to be undefined after the loop is complete. If you need a defined variable after the loop, use while or repeat – Nick Hodges Apr 9 at 22:45

Depending upon how the loop variable is used within the loop, the compiler may even eliminate it completely and simply use a pointer to iterate through the elements of an array, for example. – Allen Bauer Apr 10 at 0:02

... is undefined ... except if you terminate the loop with the 'break' statement. In that case, value is defined (the last value the loop counter had before the 'break' was executed). – gabr Apr 10 at 5:57
Der Sonderfall Break bzw. Exit wird von Gabrijelcic angerissen, in der Delphi Hilfe bzw. Daniels Delphi Referenz darauf wird das im Detail erörtert.

Gruß,
Assertor

DelTurbo 10. Jun 2010 19:15

AW: Achtung. Optimierung beim Compiler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Warnungen sind an. Nein es kommt keine warnung. Sonst hätte ich nicht suchen müssen sondern sofort gewusst was schief läuft.

Lasse ich die Optimierung an und mache zusätlich ein WriteLn(i); rein hat i auchwieder den "richtigen" wert. Da kann man dann auch schön sehen das die Optiemierung nicht gut ist. Statt es weiterhin in einem register zu machen, was beim call kurz gepusht wird, sieht der code aus als wäre er nicht optimiert.

Ich habe grad mal einen 3zeiler gemacht. Es kommt keine warung. Kann ja jeder mal durchjagen, der möchte.

Zum testen ob ich Hinweise und Warungen bekomme, (ich habe auch nun mind. 3x nachgesehen, die hacken sind drinn) hatte ich in dem Projekt noch i1 drinne und wollte das ausgeben. Da kommt denn ein Hinweis das es nicht initialisiert wurde.

Ich habe übrigens nicht D2005 sondern D7. Ob das eine rolle spielt weiss ich nicht. Mit dem neuen Board hier sieht man wohl nichtmehr welche version jemand nuzt. Und D7 kann man nicht einstellen.

EDIT:
Zitat:

Zitat von Assertor (Beitrag 1027916)
Um die Eingangsfrage zu beantworten: Ja, das Verhalten ist bekannt.

Das wusste ich nicht. Da ich ja blutiger anfänger bin und mich kaum im netz rumtreibe, laufen solchen speziellen info an mir vorbei.

Was ich eigentlich nur erreichen wollte ist, das nicht andere auf diese sache reinfallen. Und keines falls einen Thread erzeugen der nun 3 Seiten lang ist. Eigentlich war es nur als info gedacht.

Klaus01 10. Jun 2010 20:14

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von DelTurbo (Beitrag 1027196)
Beispiel:
Ich habe ein InUse = Array[0..100] of Boolean. Das wird von mehreren Threads genutzt. Und auch wieder frei gegeben. Mein Sourcecode war wie folgt.

Delphi-Quellcode:
for i:=0 to 100 do
begin
  if NOT InUse[i] then ....
end;
Ziel war es von "unten" einen leeren Slot zu suchen. Ich habe fast eine Stunde gebraucht bis ich rausfand das die schleifen rückwärts läuft. Man kann es nur im Assembler sehen.

Guten Abend DelTurbo,

so ganz verstehe ich die Aufregung nicht.
Ziel war es einen freien Slot zu finden, ob der nun näher bei der 0 oder bei der 100 liegt
dürfte dem Programmablauf doch relativ wurscht sein. Es soll doch nur ein freier Slot gefunden werden.


Grüße
Klaus

DelTurbo 11. Jun 2010 09:48

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von Klaus01 (Beitrag 1027963)
so ganz verstehe ich die Aufregung nicht.
Ziel war es einen freien Slot zu finden, ob der nun näher bei der 0 oder bei der 100 liegt
dürfte dem Programmablauf doch relativ wurscht sein. Es soll doch nur ein freier Slot gefunden werden.

Hier ist doch keine aufregung. Bitte schau dir den Assemblercode an.

Aber ich wiederhohlen gerne nochmal. Es ging legendlich darum, anderen usern die möglichkeit zu geben nicht in die selbe "falle" zu stolpern. Es war kein 3 Seitenlanger Thread geplant.

Hintergrund warum ich das gemacht habe: Wenn man etwas sucht, ist delphipraxis immer weit oben bei den treffen. (Ich hoffe nur das der googlebot schnell die links korrigiert) So gelangte ich damals auch hier her. Und ich merkte schnell das einem, auch wenn man anfänger ist, hier immer geholfen wird. An dieser stelle nochmals ein dickes lob an die Mod´s und den ganzen usern hier im Board.

Da meine "demo" schon 7x geladen wurde und keinerlei rückmeldung kommt, nehme ich an das auch bei anderen Delphi-versionen keine warnung kommt.

Wäre toll wenn dieses noch als rückmeldung käme. Ein satz reicht um hier nicht weiter abzugleiten.

uligerhardt 11. Jun 2010 10:41

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von DelTurbo (Beitrag 1028040)
Da meine "demo" schon 7x geladen wurde und keinerlei rückmeldung kommt, nehme ich an das auch bei anderen Delphi-versionen keine warnung kommt.

  1. An deiner Demo kann man gar nicht sehen, ob die Suche "von oben" oder "von unten" läuft, weil du nur ein Element mit Wert True in MyArray hast. Erst, wenn man noch ein weiteres einfügt (z.B.
    Delphi-Quellcode:
    MyArray[7] := True;
    ), wird's aussagekräftig.
  2. Ich habe Optimierung aktiviert. Trotzdem läuft i bei mir (D2007) im Debugger hoch und nicht runter.
Also irgendwie kann ich kein Problem feststellen. :-P

Stevie 11. Jun 2010 10:43

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von DelTurbo (Beitrag 1028040)
Da meine "demo" schon 7x geladen wurde und keinerlei rückmeldung kommt, nehme ich an das auch bei anderen Delphi-versionen keine warnung kommt.

Wäre toll wenn dieses noch als rückmeldung käme. Ein satz reicht um hier nicht weiter abzugleiten.

Es kommt keine Warning, weil du mit Break aus der Schleife gehst und daher i einen definierten Wert hat (wie oben schon zitiert wurde). Hast du kein break, wird eine Warning ausgegeben. Und in der Tat steht bei mir i dann auf 10, obwohl laut der Schleife nur von 0 bis 9 gelaufen wird.

Zitat:

Zitat von uligerhardt (Beitrag 1028070)
  1. An deiner Demo kann man gar nicht sehen, ob die Suche "von oben" oder "von unten" läuft, weil du nur ein Element mit Wert True in MyArray hast. Erst, wenn man noch ein weiteres einfügt (z.B.
    Delphi-Quellcode:
    MyArray[7] := True;
    ), wird's aussagekräftig.
  2. Ich habe Optimierung aktiviert. Trotzdem läuft i bei mir (D2007) im Debugger hoch und nicht runter.
Also irgendwie kann ich kein Problem feststellen. :-P

Im Debugger sieht man auch nix vom rückwärts laufen, sondern nur im asm code (wurde auch im Eingangspost erwähnt)

uligerhardt 11. Jun 2010 10:52

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von Stevie (Beitrag 1028072)
Im Debugger sieht man auch nix vom rückwärts laufen, sondern nur im asm code (wurde auch im Eingangspost erwähnt)

Ach, da war ich wohl im Überschwang des vermeintlichen Erfolgs zu schnell.:oops:

DelTurbo 11. Jun 2010 10:56

AW: Achtung. Optimierung beim Compiler
 
Zitat:

Zitat von p80286 (Beitrag 1027904)
Eigentlich hätte eine Warnung auftauchen müssen,daß das I nach dem Schleifendurchlauf undefiniert ist.

Mir ging es darum. Ob andere Delphi´s eine warnung auspsucken, wie p80286 beschreibt. Diese "demo" ist nur für diesen zweck.

Zitat:

Zitat von Stevie (Beitrag 1028072)
Es kommt keine Warning, weil du mit Break aus der Schleife gehst und daher i einen definierten Wert hat (wie oben schon zitiert wurde). Hast du kein break, wird eine Warning ausgegeben. Und in der Tat steht bei mir i dann auf 10, obwohl laut der Schleife nur von 0 bis 9 gelaufen wird.

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz