![]() |
brauche kleine Hilfe in ASM, Flaschenhals
ich habe hier eine Funktion, die mein programm irgendwie bremst.
Wenn ich sie testweise abschalte, dann bin ich 20-30 prozent schneller, und das in einem komplexen Verarbeiten von noch viel mehr Funktionen und proceduren. kann man das in ASM vielleicht schneller gestalten oder lässt sich da nicht mehr soviel rausholen ? Habe leider keine Ahnung von Assembler. Deshalb wollte ich Euch mal um Rat fragen. Vielen Dank !
Delphi-Quellcode:
function SmallToDouble(CodZahl : Integer): Double;
var Scale : Integer; begin // Entschlüsseln !! // Maske := 3; // 0000 0000 0000 0000 0000 0000 0000 0011 case ( (CodZahl shr 29) and 3) of 0 : Scale := 100; 1 : Scale := 10000; 2 : Scale := 1000000; else Scale := 1; end; // löschen der Bits // MaskePositiv := $9FFFFFFF; // 1001 1111 1111 1111 1111 1111 1111 1111 // MaskeNegativ := $60000000; // 0110 0000 0000 0000 0000 0000 0000 0000 if CodZahl >= 0 then CodZahl := CodZahl and $9FFFFFFF // Bits müssen Null sein else CodZahl := CodZahl or $60000000; // Bits müssen Eins sein Result := CodZahl / Scale; end; |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Hi,
Deine Funktion wird schon recht kompakt in Assembler umgesetzt - und zwar automatisch von Delphi. Der aufwändigste Teil ist die Division in der letzten Zeile. Aber auch das lässt sich von Hand wahrscheinlich nicht mehr gut optimieren. Stellt sich die Frage, ob es nicht einen besseren Algo für die gesamte Umwandlung gibt. Wie hast Du eigentlich den hohen Laufzeit-Anteil ermittelt? Hast Du dafür den Source instrumentiert oder ist das nur eine Schätzung? |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Moin Stoxx,
mal abgesehen von der Division: Das SHR im Case kannst Du Dir doch auch einsparen. Kostet Zeit und ist ja eigentlich reine Bequemlichkeit ;-) |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Zitat:
Die Datenmenge ist nun kleiner, aber müssen nun "encodiert" werden. Und eigentlich dachte ich durch das lesen von Festplatte einen Geschwindigkeitsvorteil zu bekommen. Dem war aber nicht so, leider. Irgendwann cached Windows die Daten aber sowieso im RAM ( bei 2 GB ) . Erster Test mit einem "kleine" 50 MB File. Zitat:
|
Re: brauche kleine Hilfe in ASM, Flaschenhals
Hi,
was sind denn das für Werte - Meßdaten? Und das Format dieser 32-Bit Werte, hat das einen Namen? Vielleicht gibts da ja eine Library oder einen Algorythmus zur Umwandlung wenn es sich um einen Standard handelt. Und was machst Du mit den Werten nachdem Du sie eingelesen und umgewandelt hast? Kommen die in eine Datenbank oder berechnest Du daraus einen statistischen Wert? Das Einlesen in den Speicher ist aufgrund des Delphi Memory Managers nicht immer die performanteste Variante. Liest Du das Ganze in einen MemoryStream ein oder wie hast Du das gelöst? |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Anstaat Code um 29 stellen nach rechts zu shiften und die dann untersten 2 bits zu prüfen, prüfe doch einfach die obersten 2 bits....
|
Re: brauche kleine Hilfe in ASM, Flaschenhals
Delphi-Quellcode:
function SmallToDouble(CodZahl: Integer): Double;
var Scale: Double; begin case CodZahl and (3 shl 29) of (0 shl 29) : Scale := 1/100; (1 shl 29) : Scale := 1/10000; (2 shl 29) : Scale := 1/1000000; else Scale := 1; end; if CodZahl >= 0 then CodZahl := CodZahl and $9FFFFFFF // Bits müssen Null sein else CodZahl := CodZahl or $60000000; // Bits müssen Eins sein Result := CodZahl * Scale; end; |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Zitat:
Zitat:
Zitat:
|
Re: brauche kleine Hilfe in ASM, Flaschenhals
Na ja, wenn das Deine Erfindung ist, dann weißt Du ja nun auch, wo die 'Schwachstelle' ist. Alternativ hätte man auch einfach unsigned 32-bit fixed point mit festen 4 Decimals nehmen können: Damit hätte man immerhin Kurse bis 429496,7296 Darstellen können. Mit anderen Worten: Der Kurs wird als 10000stel cent als Cardinal dargestellt, da braucht man dann gar keine Umwandlung mehr. Und Rundungsfehler gibt es, zumindest bei der Addition auch nicht mehr. Nur beim Rechnen müsste man auf 64 bit erweitern...
Na egal, hinterher ist man immer schlauer. :zwinker: |
Re: brauche kleine Hilfe in ASM, Flaschenhals
Zitat:
Dummerweise haben einige Futures und Forex Kurse 6 Nachkommastellen. (z.B. USD/JPY Future hat 6 Nachkommastellen) Mit 4294,967296 bei einem Festkomma von 6 wird es arg knapp ;-) ich kann jetzt: FMinValue2 = -5368709.12; FMaxValue2 = 5368709.11; FMinValue4 = -53687.0912; FMaxValue4 = 53687.0911; FMinValue6 = -536.870912; FMaxValue6 = 536.870911; // FMinValue8 = -5.36870912; //frei // FMaxValue8 = 5.36870911; @Hagen .. 3 shl 29 ist eine super Idee ! Das war das, wo ich im Gefühl hatte, man kann noch etwas ändern ;-) ich glaube ich bin zufrieden, werde es jetzt mal ausgiebig testen. Vielen Dank !! Gruß stoxx |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 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