Einzelnen Beitrag anzeigen

OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#1

Performance Inline Assembler vs. Objekt Pascal

  Alt 19. Nov 2003, 13:26
Hallo Leute!

Ich habe eben zur geistigen Erbauung und Unterstützung der Verdauung meine Routine, mit der ich
eine Speicherstelle in meiner Bitmap (24 Bit Farbtiefe) bei gegebener Füllfarbe FColor blende, in Assembler übersetzt. Dabei sind pCol der Zeiger auf RGB im Speicher und FAC der Blending-Faktor im Bereich 0..1. So ...:

Delphi-Quellcode:
// Blendet ein Pixel mit Füllfarbe FColor und Faktor FAC=X/255=0..1
Procedure TDIBSection24.BlendColFACPtrF(pCol:PByte; FAC:Double);
Var Temp:Integer;
  asm
    // Init
    push ebx
    push esi
    mov esi, eax
    mov ebx, edx

    xor eax, eax
    xor edx, edx

    mov al, Byte([esi].FColor)
    mov dl, [ebx]
    sub eax, edx
    mov Temp, eax
    fild Temp
    fmul FAC
    sub esp, $04
    fistp DWord Ptr[esp]
    fwait
    pop eax
    add [ebx], al

    inc ebx
    mov al, Byte([esi].FColor+1)
    mov dl, [ebx]
    sub eax, edx
    mov Temp, eax
    fild Temp
    fmul FAC
    sub esp, $04
    fistp DWord Ptr[esp]
    fwait
    pop eax
    add [ebx], al

    inc ebx
    mov al, Byte([esi].FColor+2)
    mov dl, [ebx]
    sub eax, edx
    mov Temp, eax
    fild Temp
    fmul FAC
    sub esp, $04
    fistp DWord Ptr[esp]
    fwait
    pop eax
    add [ebx], al

    pop esi
    pop ebx
End;

Begin
  pCol^:=pCol^+Round((TColorARGB(FColor).R-pCol^)*FAC); Inc(pCol);
  pCol^:=pCol^+Round((TColorARGB(FColor).G-pCol^)*FAC); Inc(pCol);
  pCol^:=pCol^+Round((TColorARGB(FColor).B-pCol^)*FAC);
End;
Ok, funktioniert beides sehr fix. Aber die Pascal Variante ist um mehr als 10% schneller als mein Assembler Code. Obwohl ich definitiv Befehle gespart habe. Der Call Round fehlt bei mir und die Register eax, edx werden nur anfangs genullt während der Compiler das für jeden Farbwert durchführt. Des weiteren wird von Round nen 64Bit Integer auf den Stack gepush während ich nur nen DWord nach eax übertrage.

Jetzt die Frage: WARUM ist mein Code langsamer in der Ausführung? Gibt es da intere Spielregeln, die ich nicht kenne? Ist nicht das erste Mal, dass mir eben diese aufgefallen ist.

Obwohl ich damit auch gleichzeitig ne Lanze für Delphi brechen kann. Da brummt schon ein guter Motor unter unserer Haube.

Viele Grüsse

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat