AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Performance Inline Assembler vs. Objekt Pascal
Thema durchsuchen
Ansicht
Themen-Optionen

Performance Inline Assembler vs. Objekt Pascal

Ein Thema von OLLI_T · begonnen am 19. Nov 2003 · letzter Beitrag vom 20. Nov 2003
 
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
 


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 08:42 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