Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#25

Re: FOR-Schleifenvariable muss eine lokale Variable sein. Wa

  Alt 24. Aug 2003, 19:00
Code:
Befehle     Taktzyklen
-----------------------
DEC ECX     1
JNZ Beginn  3

LOOP Beginn 6
Die Taktzyklen beziehen sich auf einen i486 und stammen aus dem Referenzhandbuch von Borland zu Turbo Assembler.


Hier ein Geschwindigkeitstest:
Delphi-Quellcode:
function RDTSC: Int64;
asm
        RDTSC
end;

function Test_Loop(Count: Integer): Int64;
asm
        MOV ECX, EAX
        RDTSC // Startzeit ermitteln (Result=EDX:EAX)
@@Repeat:
        LOOP @@Repeat
end;

function Test_DecJcc(Count: Integer): Int64;
asm
        MOV ECX, EAX
        RDTSC // Startzeit ermitteln (Result=EDX:EAX)
@@Repeat:
        DEC ECX
        JNZ @@Repeat
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  Count = $5fffffff;
var
  t1, t2: Int64;
begin
  try
    SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

    t1 := Test_Loop(Count);
    t1 := RDTSC - t1;

    t2 := Test_DecJcc(Count);
    t2 := RDTSC - t2;

  finally
    SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_NORMAL);
  end;

  Memo1.Lines.Add('LOOP : ' + IntToStr(t1));
  Memo1.Lines.Add('DEC/Jcc: ' + IntToStr(t2));
  Memo1.Lines.Add('');
end;
Auf P4 2GHz kommen im Schnitt folgende Werte zustande:
Code:
LOOP  : 538596152
DEC/Jcc: 403735408
  Mit Zitat antworten Zitat