AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Achtung. Optimierung beim Compiler

Ein Thema von DelTurbo · begonnen am 8. Jun 2010 · letzter Beitrag vom 11. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AW: Achtung. Optimierung beim Compiler

  Alt 8. Jun 2010, 21:49
Schau mal hier.

Auf Delphi-Treff war mal ein guter Artikel dazu, finde den gerade aber nicht mehr.

PS: Thread solltest du auch ein einer T(Object)List verwalten, z.B.. Da hast du auch nicht das Problem einen freien Platz suchen zu müssen.

// edit
Soweit ich das noch weiß, optimiert der Compiler das dahingehend, da die CPU scheinbar leichter und schneller um 1 dekrementieren als inkrementieren kann. Aber einen Unterscheid sollte in deinem Programm nicht auftreten. Beim Debuggen findet du lediglich die "falschen" Werte, intern wird aber alles richtig ausgeführt.

// edit 2:
Hier, ganz unten findest du das auf Delphi Treff.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 8. Jun 2010 um 21:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Achtung. Optimierung beim Compiler

  Alt 8. Jun 2010, 22:02
Grund ist dass sehr einfach auf "=0" geprüft werden kann. ein "=100?" läuft also auf ein "x-100=0?" 'raus

Aber eigentlich sollte die Compileroptimierung keine Änderung des Verhaltens zeigen - wie du richtig festgestellt hast, lässt der Compilrr die Schleife vorwärts laufen sobald es einen Unterschied macht (=> eine Ausgabe erzeugt o.ä.)

Kann mit
{O+} und {O-}
gesteuert werden
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.246 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 09:44
Grund ist dass sehr einfach auf "=0" geprüft werden kann. ein "=100?" läuft also auf ein "x-100=0?" 'raus
Ne, das ist so nicht richtig. Wie ich oben schrieb braucht es ein cmp (Assembler) weniger. Richtig rum sähe das so aus

mov [register+?],0 // Startwert
schleife:
inc [register+?] // Wert einen hochzählen
cmp [register+?],$5a // Vergleichen ob MAX erreicht ist.
jne schleife

nach der Optimierung sieht es so aus

mov [register+?],$5a // MAX Wert
schleife:
dec [register+?] // Einen vom MAX abziehen
jnz schleife // Wenn nicht 0 dann weiter

Das ist extra so "platt" geschrieben das auch leute die kein Assembler können es verstehen sollten.

Gruss

PS.: Danke, das mit dem {O+} und {O-} werde ich mir merken.

EDIT: Ich weiss nicht was ihr mit Debugger meint. Ich meine das CPU-Fenster. Da sieht man wirklich was abgeht.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo ( 9. Jun 2010 um 09:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.431 Beiträge
 
Delphi 12 Athens
 
#4

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 09:56
PS.: Danke, das mit dem {O+} und {O-} werde ich mir merken.
Oder sieh dich mal in den Projektoptionen um. :

EDIT: Ich weiss nicht was ihr mit Debugger meint. Ich meine das CPU-Fenster. Da sieht man wirklich was abgeht.
Rate mal, wer dir Zugang zu diesem Fenster gewährt?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.246 Beiträge
 
Delphi 2007 Architect
 
#5

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 10:06
Jo,

in den Projektoptionen habe ich das ja ausgemacht nachdem ich den salat gesehen habe. Es geht nur darum das man es dort z.b. Generell ausmacht und einzelne Proceduren optimiert. Oder halt andersrum.

Steht aber so auch in meinem ersten post.

Zitat:
Gibt es flags/parameter womit man teile des programms von der optimierung ausschliessen kann?
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 10:19
Die Frage war eben ob es überhaupt notwendig ist an der Stelle die Optimierung abzuschalten. Denn wie bereits erwähnt wurde sollte sich die Optimierung nicht derart auswirken das eine falsche Logic entsteht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.246 Beiträge
 
Delphi 2007 Architect
 
#7

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 10:44
Denn wie bereits erwähnt wurde sollte sich die Optimierung nicht derart auswirken das eine falsche Logic entsteht.
Macht es aber....
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.431 Beiträge
 
Delphi 12 Athens
 
#8

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 10:53
Hab noch nie mitbekommen, daß es dadurch Probleme gibt.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

var
  i: Integer;
  InUse: Array[0..20] of Boolean;
  Sr, S: String;
begin
  for i := 0 to 20 do
    InUse[i] := Boolean(Random(2));
  Sr := '';
  for i := 0 to 20 do begin
    // zählt problemlos rückwärts
    if not InUse[i] then Sr := Sr + 'jelse Sr := Sr + 'n';
  end;
  S := '';
  for i := 0 to 20 do begin
    WriteLn(i);
    if not InUse[i] then S := S + 'jelse S := S + 'n';
  end;
  WriteLn(Sr);
  WriteLn(S);
end.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#9

AW: Achtung. Optimierung beim Compiler

  Alt 8. Jun 2010, 22:05
Soweit ich das noch weiß, optimiert der Compiler das dahingehend, da die CPU scheinbar leichter und schneller um 1 dekrementieren als inkrementieren kann.
Nein, der Compiler optimiert die Schleife so, dass sie nicht von n..m, sondern von (n-m-1)..0 läuft. Da bei Operationen wie Inc- und Dekrementieren bereits das Zero-Flag gesetzt wird, wenn der Wert 0 wird, erspart man sich einen Vergleich pro Schleifendurchlauf.

Aber einen Unterscheid sollte in deinem Programm nicht auftreten. Beim Debuggen findet du lediglich die "falschen" Werte, intern wird aber alles richtig ausgeführt.
Ja, der Zugriff auf InUse[i] erfolgt in der richtigen Reihenfolge. Der Compiler speichert sich den Zeiger auf InUse[0], und inkrementiert diesen bei jedem Schleifendurchlauf, während der Index dekrementiert wird. Läuft insgesamt schneller, und das Array wird in der korrekten Reihenfolge abgearbeitet.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Achtung. Optimierung beim Compiler

  Alt 9. Jun 2010, 06:47
Hallo,

was mich eh interessiert.
Wieso hast du beim Debuggen die Optimierung angeschaltet ?


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.
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