![]() |
Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
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:
Das Loop ist deswegen kommentiert, weil es komischerwiese nicht ging. Er hat einfach weitergemacht, obwohl CX 3 war. Deswegen habe ich es selber geschrieben.
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; Jetzt meine Frage: Ich prüfe mit folgender Funktion die Zeit, die die Ausführung benötigt:
Delphi-Quellcode:
KANN es sein, dass ich 0ms rausbekomme? (AMD Athlon 3000+) Die gleiche Delphi-Funktion
var Start: Int64;
I: Integer; begin Start:=GetTickCount; for I:=0 to 50000000 do Darken2(clRed, 50); ShowMessage(IntToStr(GetTickCount-Start));
Delphi-Quellcode:
benötigt etwa 5000ms
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; Irgendwie ist das Komisch, und ich finde keinen Fehler :gruebel: Gruß, Moritz |
Re: Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
Schalte mal die Compileroptimierung aus, dann dauerts auch länger ;)
|
Re: Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
JA, jetzt geht es :) Danke. Logischerweise hat er die 50 Mio Aufrufe rausgekürzt *g* Allerdings nur bei der Assembler-Funktion :gruebel:
Kann ich die Optimierung denn nur für diese Funktion deaktiviern?
Delphi-Quellcode:
Mit {O-} geht es leider nicht
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 LOOP @@CLC POPA MOV EAX, Buffer end; |
Re: Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
Probiers mal andersrum, also fürs gesamte Projekt in den Projektoptionen die Optimierung abzuschalten udn dann überall bis auf in der ASM-Prozedur per Compilerschalter die Optimierung einzuschalten^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 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