AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Operationen mit Bitstrukturen optimieren

Ein Thema von to-wer · begonnen am 30. Okt 2017 · letzter Beitrag vom 30. Okt 2017
Antwort Antwort
to-wer

Registriert seit: 25. Mär 2007
29 Beiträge
 
#1

Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 17:41
Hallo zusammen,

habe ein Programm geschrieben, welche aus einem Datenstrom einen anderen erzeugt, was auch läuft. Allerdings braucht es bei 60.000 zu konvertierenden Bytes ca. 30 Sekunden, was an meiner vielleicht umständlichen Programmierung liegt. Nun möchte ich es gerne etwas schneller machen.
Es gibt immer drei Bytes auszuwerten, in denen bestimmte Bit positive oder negative Schrittweiten darstellen.

Bit No, 7 6 5 4 3 2 1 0
Byte 1 y+1 y-1 y+9 y-9 x-9 x+9 x-1 x+1
Byte 2 y+3 y-3 y+27 y-27 x-27 x+27 x-3 x+3
Byte 3 ev1 ev2 y+81 y-81 x-81 x+81 set set

Momentan habe ich die drei Hex-Bytes mit HexToBins in Strings gewandelt.
Die Schrittweiten berechne ich mit
dx:= StrToInt(hs1[8])-StrToInt(hs1[7])+9*StrToInt(hs1[6])-9*StrToInt(hs1[5])+3*StrToInt(hs2[8])-3*StrToInt(hs2[7])+27*StrToInt(hs2[6])-27*StrToInt(hs2[5])+81*StrToInt(hs3[6])-81*StrToInt(hs3[5]);

dy:= StrToInt(hs1[1])-StrToInt(hs1[2])+9*StrToInt(hs1[3])-9*StrToInt(hs1[4])+3*StrToInt(hs2[1])-3*StrToInt(hs2[2])+27*StrToInt(hs2[3])-27*StrToInt(hs2[4])+81*StrToInt(hs3[3])-81*StrToInt(hs3[4]);

Nutze das Bit also als Multiplikator in einem Term aus den verschiedenen Summanden.
Letztendlich habe ich auch schon die Formel jeweils durch feste Zuweisungen ersetzt, um zu sehen, wo der Flaschenhals ist. Viel hat es nicht gebracht - unter 10%.
Hat jemand eventuell eine Idee? Wenn nicht, ist auch nicht so schlimm. Dann wartet man eben.

Vielen Dank
Torsten
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 17:57
Hallo,

Du solltest dir mal Bitoperationen anschauen. Das ganze Umwandeln in Strings und dann die Strings wieder in Ints umwandeln dauert Jahre.

Probier das mal:
Delphi-Quellcode:
function BytesToPoint(pt: TPoint; b1,b2,b3: Byte): TPoint;

const B1ValuesX: Array[0..7] of Integer = (1, -1, 9, -9, 0, 0, 0, 0);
const B1ValuesY: Array[0..7] of Integer = (0, 0, 0, 0, -9, 9, -1, 1);
const B2ValuesX: Array[0..7] of Integer = (3, -3, 27, -27, 0, 0, 0, 0);
const B2ValuesY: Array[0..7] of Integer = (0, 0, 0, 0, -27, 27, -3, 3);
const B3ValuesX: Array[0..7] of Integer = (0, 0, 81, -81, 0, 0, 0, 0);
const B3ValuesY: Array[0..7] of Integer = (0, 0, 0, 0, -81, 81, 0, 0);

var i: Integer;
begin
  for i:=0 to 7 do
  begin
    if (b1 and (1 shl i)) <> 0 then
    begin
      pt.X := pt.X + B1ValuesX[i];
      pt.Y := pt.Y + B1ValuesY[i];
    end;

    if (b2 and (1 shl i)) <> 0 then
    begin
      pt.X := pt.X + B2ValuesX[i];
      pt.Y := pt.Y + B2ValuesY[i];
    end;

    if (b3 and (1 shl i)) <> 0 then
    begin
      pt.X := pt.X + B3ValuesX[i];
      pt.Y := pt.Y + B3ValuesY[i];
    end;
  end;

  Result := pt;
end;
Je nach Geschmack gehts mit weniger Arrays und mehr Code oder vllt. generell mehr Code weil die Arrays von den Werten ja eigentlich ein vielfaches von 3 sind und man das auch so berechnen könnte, WENN das 3 Byte da nicht so aus der Reihe fallen würde.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (30. Okt 2017 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 18:50
Eventuell so:
(Nicht getestet!)
Delphi-Quellcode:
PROCEDURE GetSteps(H1,H2,H3:Byte; var DX,DY:Integer);
begin
   DX:=Ord(H1 and 1>0) - // dx:=StrToInt(hs1[8]) -
       Ord(H1 and 2>0) + // StrToInt(hs1[7]) +
       9*Ord(H1 and 4>0) - // 9*StrToInt(hs1[6]) -
       9*Ord(H1 and 8>0) + // 9*StrToInt(hs1[5])+
       3*Ord(H2 and 1>0) - // 3*StrToInt(hs2[8]) -
       3*Ord(H2 and 2>0) + // 3*StrToInt(hs2[7]) +
       27*Ord(H2 and 4>0) - // 27*StrToInt(hs2[6]) -
       27*Ord(H2 and 8>0) + // 27*StrToInt(hs2[5]) +
       81*Ord(H3 and 4>0) - // 81*StrToInt(hs3[6]) -
       81*Ord(H3 and 8>0); // 81*StrToInt(hs3[5]);

   DY:=Ord(H1 and 128>0) - // dy:=StrToInt(hs1[1]) -
       Ord(H1 and 64>0) + // StrToInt(hs1[2]) +
       9*Ord(H1 and 32>0) - // 9*StrToInt(hs1[3]) -
       9*Ord(H1 and 16>0) + // 9*StrToInt(hs1[4]) +
       3*Ord(H2 and 128>0) - // 3*StrToInt(hs2[1]) -
       3*Ord(H2 and 64>0) + // 3*StrToInt(hs2[2]) +
       27*Ord(H2 and 32>0) - // 27*StrToInt(hs2[3]) -
       27*Ord(H2 and 16>0) + // 27*StrToInt(hs2[4]) +
       81*Ord(H3 and 32>0) - // 81*StrToInt(hs3[3]) -
       81*Ord(H3 and 16>0); // 81*StrToInt(hs3[4]);
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
to-wer

Registriert seit: 25. Mär 2007
29 Beiträge
 
#4

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 19:20
Hallo General,

erstmal vielen Dank für diese super strukturierte Funktion.
Habe sie integriert und den Zeitvergleich gemacht... die ganze Prozedur ist in Summe fast genauso langsam wie meine Variante. 2-3 Sekunden schneller.
Muss aber dazu sagen, dass ich gleichzeitig beim Berechnen noch die Zeichnung grafisch ausgebe und berechnete Strings in eine Listbox ausgebe.

Gerade habe ich getestet und festgestellt, dass die zwei Listbox.Items.Add Befehle pro Schleifendurchlauf die meiste Zeit brauchen.
Komplett mit Listbox und Zeichnen: 25 sek
ohne Listbox, mit Zeichnen: 8 sek
nur berechnen: 5 sek

Wenn ich hier die 2-3 Sekunden abziehe, ist die Funktion mindestens doppelt so schnell, fällt im gesamten Kontext aber nicht auf.
  Mit Zitat antworten Zitat
to-wer

Registriert seit: 25. Mär 2007
29 Beiträge
 
#5

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 19:35
habe gerade herausgefunden, dass durch das Ausblenden der Listbox während der Ausgabe noch 10 Sekunden gespart werden können.
Das sollte vorerst reichen. Danke für eure Vorschläge und viele Grüße.

Torsten
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 19:39
BeginUpdate und EndUpdate Methoden der ListBox rufst du auf? Das wäre die korrekte Alternative zum kompletten Ausblenden der Komponente.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#7

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 19:58
Sind das nicht Methoden von TStrings, also hier von TListbox.Items?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 20:41
Sollte man den String nicht als string erstellen und später TStrings.Text setzen?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Operationen mit Bitstrukturen optimieren

  Alt 30. Okt 2017, 20:51
Sollte man den String nicht als string erstellen und später TStrings.Text setzen?
Das kann man auch machen. Mit BeginUpdate/EndUpdate sollte die Performance theoretisch aber gleich gut sein.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 04:28 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