AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Assembler: 0 ms für 50 Mio Durchläufe einer Funktion?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von moritz · begonnen am 31. Jan 2005 · letzter Beitrag vom 31. Jan 2005
Antwort Antwort
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, 20: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
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 31. Jan 2005, 20:29
Schalte mal die Compileroptimierung aus, dann dauerts auch länger
  Mit Zitat antworten Zitat
moritz

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

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

  Alt 31. Jan 2005, 20:47
JA, jetzt geht es Danke. Logischerweise hat er die 50 Mio Aufrufe rausgekürzt *g* Allerdings nur bei der Assembler-Funktion
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
"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
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#4

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

  Alt 31. Jan 2005, 21:25
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^^
Julian J. Pracht
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz