AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Dyn. Array Teilmenge schnell kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dyn. Array Teilmenge schnell kopieren

Ein Thema von Satty67 · begonnen am 22. Apr 2011 · letzter Beitrag vom 23. Apr 2011
Antwort Antwort
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#1

Dyn. Array Teilmenge schnell kopieren

  Alt 22. Apr 2011, 22:06
Hallo,

ich muss einen Abschnitt eines Dynamischen Arrays in ein zweites Array kopieren. (Hab' mich entschlossen, endlich mal MergeSort zu verstehen und umzusetzen... läuft inzwischen auch)

Symbolischer Codeausschnitt:
Delphi-Quellcode:
type
  TPointerArray = array of Pointer;
var
  Base, Part : TPointerArray;
  i, offset, count : Integer;
begin
  // alles initialisiert (SetLength etc.) und
  // offset/count berechnet

  for i := 0 to Count-1 do
    Part[i] := Base[offset + i];
Funktioniert auch, nur wollte ich es beschleunigen (mit Move).
Die For-Schleife ist wie folgt ersetzt:
  Move(Base[offset], Part[0], count); .
Mir füllt es aber das Part-Array mit lauter Nullen, statt mit den realen Werten.

Ich komme nicht drauf, was schief läuft.

Alternativ nehme ich auch einen anderen Vorschlag, wie ich die Kopieraktion in der For-Schleife beschleunigen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Dyn. Array Teilmenge schnell kopieren

  Alt 22. Apr 2011, 23:31
wenn ich das im Debugger anschaue sieht alles so aus wie ich es erwarten würde...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Base, Part : TPointerArray;
begin
  Setlength(Base,100);
  Setlength(Part,100);
  Base[10] := self;
  Base[11] := self; Base[12] := self; Base[13] := self;
  Move(Base[10],Part[0],5*SizeOf(Pointer));

end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Dyn. Array Teilmenge schnell kopieren

  Alt 23. Apr 2011, 00:11
Danke!

Dein Post hat geholfen die Tomaten von den Augen zu bekommen

Count muss beim Move natürlich mit SizeOf(Pointer) multipliziert werden

Move(Base[offset], Part[0], count * SizeOf(Pointer)); .

Move spart nochmal 7% Zeit beim Gesamtergebnis

Geändert von Satty67 (23. Apr 2011 um 00:17 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Dyn. Array Teilmenge schnell kopieren

  Alt 23. Apr 2011, 01:14
Was mich allerdings grad etwas wundert, weil Move() intern doch auch nur über eine Schleife kopiert - und zwar byteweise! Sollte es nicht eigentlich schneller sein, die vollen 32 Bit der Pointer am Stück zu schubsen?

Aha okay, grad inne Soße geschaut. Move() kopiert, ab >32 zu verschiebenden Bytes, Quadwords. Und zwar in ASM, d.h. die Bereichsprüfung dürfte ebenfalls umgangen sein. Gut, ich drück trotzdem mal auf "Antworten", einfach um für mich nochmals zu dokumentieren, dass nochmal Nachsehen keine soooo schlechte Sache ist
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dyn. Array Teilmenge schnell kopieren

  Alt 23. Apr 2011, 01:23
Nur daß bei der Schleife im Move die Adressierunfg nicht ständig zweimal, je Wert, neu berechnet wird.
Das wird nur einmal und dann wird nur noch weitergezählt.

PS: Seit Delphi 2006/2007, also seit das FastCodeProjekt im Delphi aufgenmmen wurde, ist dieses Move soweit optimiert, daß dort sogar MMX-Register genutzt werden können (je bis zu 8 Byte pro Schleifendurchlauf)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Dyn. Array Teilmenge schnell kopieren

  Alt 23. Apr 2011, 01:41
QWords eben, jup, stimmt. Und aha! Ich hatte noch das Move von D7 im Hinterkopf, und da vermutlich auch nur den Pascal-Fallback, da ich damals noch zu wenig ASM konnte um das zu kapieren
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 18:02 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