AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Compilerschalter $O+ zur Code-Optimierung
Thema durchsuchen
Ansicht
Themen-Optionen

Compilerschalter $O+ zur Code-Optimierung

Ein Thema von daddy · begonnen am 30. Mär 2007 · letzter Beitrag vom 2. Apr 2007
 
Benutzerbild von himitsu
himitsu

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

Re: Compilerschalter $O+ zur Code-Optimierung

  Alt 31. Mär 2007, 15:06
Tja, die Codeoptimierung

Weiter Alternative:
Tricks die Optimierung einfach selber mit 'ner "sinnlosen" Abfrage aus, wo du I direkt verwendest. ^^
if I = 0 then ; I wird ja nicht wirklich benötigt, daher versucht der Compiler dieses rauszulösen.

for i := 0 to 3 do wird so schnell mal in ein for i := 3 to 0 do umgewandelt


Kannst es dir ja selber mal bei folgendem einfachem Code ansehn (siehe CPU-Ansicht):
Delphi-Quellcode:
for i := 0 to 3 do
  Beep;

// unoptimiert
asm
  mov word ptr [ebp-x], 0
  @1:
  call Beep
  inc word ptr [ebp-x]
  cmp word ptr [ebp-x], 4
  jne @1
end;

// optimiert
asm
  mov word ptr [ebp-x], 4
  @1:
  call Beep
  inc word ptr [ebp-x] // << dieses stammt wohl noch aus der nicht optimierten Variante
  dec word ptr [ebp-x] // und wie man sieht wird dadurch nicht mehr runtergezählt
  jnz @1 // inc + dec = 0
end;
Und hiernochmal speziell mit deiner ersten Schleife:
Delphi-Quellcode:
for I := 1 to C1 do
begin
  Edit1.Text := C[I];
  Edit1.Refresh;
  Sleep(500);
end;

// nicht optimiert
I := 0;
repeat
  Edit1.Text := PString(@C + i * SizeOf(String))^;
  Edit1.Refresh;
  Sleep(500);
  Inc(I);
until I = 4;

// oder leicht/nicht optimiert
I := 0;
PTemp := @C;
repeat
  Edit1.Text := PTemp^;
  Edit1.Refresh;
  Sleep(500);
  Inc(I);
  Inc(PTemp, SizeOf(String));
until I = 4;

// optimiert
I := 4;
PTemp := @C;
repeat
  Edit1.Text := PTemp^;
  Edit1.Refresh;
  Sleep(500);
//Inc(I); << hier wieder die zuviele Zeile bei der Optimierung
  Inc(PTemp, SizeOf(String));
  Dec(I);
until I = 0;
Tja, da hatt Delphi wohl wirklich ein Problem, (is aber schon länger bekannt)
aber wie du sieht, kannst du dieses leicht umgehen, indem du einfach dem Compiler sagst, daß du angeblich das I benötigst.

PS: 's sollte schon ein paar uralte Beiträge von mir zu soeinem Phänomen geben.
Hab damals versucht die Schleifenvariable in ASM zu verwenden, wo mich das Rückwärtszählen überraschte.
Delphi-Quellcode:
for i := 0 to 3 do
begin
  ...
    asm
      ...
      mov eax, &i
      ...
    end;
  ...
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 05:29 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