Einzelnen Beitrag anzeigen

moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#1

Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?

  Alt 31. Jan 2005, 19:24
Sers Leute,

angeregt von dem Thema über das verdunkeln einer Farbe habe ich mich heute hingesetzt, und dazu eine Funktion in Assembler geschrieben. Herausgekommen ist folgendes:
Delphi-Quellcode:
function Darken2(Value: TColor; Percentage: Byte): TColor;
var Buffer: Array[0..3] of Byte;
asm
  PUSHA

  MOV EBX, Value
  XOR ECX, ECX
  MOV CX, 3
  @@CLC:
    MOV AL, BL
    MUL Percentage
    MOV DL, $64
    DIV DL
    MOV byte ptr buffer[3], al
    SHR buffer, 8
    SHR EBX, 8

    SUB CX, 1
    CMP CX, 0
    JNE @@CLC
  //LOOP @@CLC

  MOV EAX, Buffer
  MOV Result, EAX
  POPA
end;
Das Loop ist deswegen kommentiert, weil es komischerwiese nicht ging. Er hat einfach weitergemacht, obwohl CX 3 war. Deswegen habe ich es selber geschrieben.
Jetzt meine Frage: Ich prüfe mit folgender Funktion die Zeit, die die Ausführung benötigt:
Delphi-Quellcode:
var Start: Int64;
    I: Integer;
begin
  Start:=GetTickCount;
  for I:=0 to 50000000 do
   Darken2(clRed, 50);
  ShowMessage(IntToStr(GetTickCount-Start));
KANN es sein, dass ich 0ms rausbekomme? (AMD Athlon 3000+) Die gleiche Delphi-Funktion
Delphi-Quellcode:
function Darken(Value: TColor; Percentage: Byte): TColor;
type PP = ^DWord;
var Buffer: Array[0..3] of Byte;
    I: Integer;
begin
  PP(@Buffer)^ := Value;
  for I:=0 to 2 do
    Buffer[I] := (Buffer[I] * Percentage) DIV 100;
  Result := PP(@Buffer)^;
end;
benötigt etwa 5000ms

Irgendwie ist das Komisch, und ich finde keinen Fehler

Gruß, Moritz
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat