Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler: 0 ms für 50 Mio Durchläufe einer Funktion? (https://www.delphipraxis.net/39310-assembler-0-ms-fuer-50-mio-durchlaeufe-einer-funktion.html)

moritz 31. Jan 2005 19:24


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:
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 :gruebel:

Gruß, Moritz

Dax 31. Jan 2005 19:29

Re: Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
 
Schalte mal die Compileroptimierung aus, dann dauerts auch länger ;)

moritz 31. Jan 2005 19:47

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:
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;
Mit {O-} geht es leider nicht

Ultimator 31. Jan 2005 20:25

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