AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein brauche kleine Hilfe in ASM, Flaschenhals
Thema durchsuchen
Ansicht
Themen-Optionen

brauche kleine Hilfe in ASM, Flaschenhals

Ein Thema von stoxx · begonnen am 22. Jun 2006 · letzter Beitrag vom 24. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 05:10
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;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 07:42
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 08:27
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#4

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:02
Zitat:
Wie hast Du eigentlich den hohen Laufzeit-Anteil ermittelt?
naja .. ich habe die Funktion einfach ausgeschaltet und dem Wert, der mit dieser Funktion was zugewiesen bekommen sollte, einen beliebigen Wert zugewiesen. Mit dieser Funktion liest mein programm große Mengen an Daten von der Festplatte in denen diese 4 Byte "Zahl" enthalten ist. Bisher waren das Double Werte (8 Byte groß)
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:
Das SHR im Case kannst Du Dir doch auch einsparen.
Kostet Zeit und ist ja eigentlich reine Bequemlichkeit
Wie meinst Du das mit dem einsparen ? Was könnte ich denn an Stelle des SHR sonst tun um die Funktionalität zu bewahren ?
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:07
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:08
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....
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:11
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;
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#8

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:16
Zitat von alzaimar:
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....
ähm, gute Idee .. aber ich wußte nicht, wie das geht ? Wie bekomme ich denn diese 2 Bits aus den 32 Bit heraus ?

Zitat:
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.
Sowas ähnliches. Das sind Tickdaten von Futures (Aktien). Das ist kein Standartformat, sondern meine eigene Erfindung. Ähnlich dem Currency Format, aber mit einer variablen Nachkommestelle. (werden in 2 Bits kodiert). Single war dazu mit 7-8 stelliger Genauigkeit etwas zu klein.

Zitat:
Das Einlesen in den Speicher ist aufgrund des Delphi Memory Managers nicht immer die performanteste Variante
das weiß ich nicht, ich kann es ja nur mit dem Zustand davor (Double Wert) vergleichen.
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 13:49
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#10

Re: brauche kleine Hilfe in ASM, Flaschenhals

  Alt 22. Jun 2006, 14:03
Zitat:
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.
ja, das sind so die ersten Gedanken, die man hat, wenn man auf das Problem stößt.
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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:00 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