Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Compilerschalter $O+ zur Code-Optimierung

  Alt 31. Mär 2007, 16: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;
$2B or not $2B
  Mit Zitat antworten Zitat