Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array zusammenhängen (https://www.delphipraxis.net/81308-array-zusammenhaengen.html)

TomDooley 24. Nov 2006 15:19


Array zusammenhängen
 
Hallo

Ich verwende folgende Funktion um ein bestendes Array zu erweitern:

Delphi-Quellcode:
procedure TTest.FillArray(var aArray: tBestehendesArray; aValues: array of integer);
var
  TmpLen : integer;
  lp : byte;
begin
  TmpLen := Length(aArray);
  SetLength(aArray,TmpLen+Length(aValues));
  for lp:=0 to high(aValues) do
    aArray[TmpLen+lp] := aValues[lp];
end;
Gibt es dafür noch eine elegantere Möglichkeit?

Der_Unwissende 24. Nov 2006 15:41

Re: Array zusammenhängen
 
Hi,
es gibt auf jeden Fall eine deutlich schnellere:

Delphi-Quellcode:
procedure TTest.FillArray(var aArray: tBestehendesArray; aValues: array of integer);
var
  TmpLen : integer;
  lp : byte;
begin
  TmpLen := Length(aArray);
  SetLength(aArray,TmpLen+Length(aValues));
  copyMemory(@aArray[TmpLen], @aValues[0], sizeOf(aValues[0]) * length(aValues));
end;
CopyMemory ist dabei aus der Unit Windows.

Gruß Der Unwissende

Dani 24. Nov 2006 15:42

Re: Array zusammenhängen
 
Hi, ich denke nicht, dass eine effizientere Implementierung sehr sinnvoll wäre, da du dir für das Aneinanderhängen von Daten sowieso eine schlecht geeignete Datenstruktur ausgesucht hast. Wenn du weißt, dass in diesem Array niemals mehr als ~100 Einträge liegen, brauchst du dir auch nicht weiter Gedanken darüber zu machen. Sind es (viel) mehr Einträge, nimm eine Datenstruktur, die zu deiner Aufgabe passt (Suchen? Sortieren? Aneinanderhängen? etc)

Gruß, Dani

shmia 24. Nov 2006 15:42

Re: Array zusammenhängen
 
Du könntest die Daten effektiver (=schneller) mit der Move Prozedure bewegen.
Aber Achtung: wäre das Array von Typ: array of string; wäre dies verboten.
Deine Prozedure könnte so aussehen (ungetestet!!!):
Delphi-Quellcode:
procedure AppendArray(var aArray: TIntegerArray; aValues: TIntegerArray);
var
  TmpLen : integer;
  lp : byte;
begin
  TmpLen := Length(aArray);
  SetLength(aArray,TmpLen+Length(aValues));
  Move(aValues[0], aArray[TmpLen], Length(aValues)*sizeof(Integer));
end;
Bei Verwendung von Move muss man höchste Vorsicht walten lassen, damit kein Speicher "zerschossen" wird.
PS: ich habe den Namen der Procedure geändert; ist so deutlich sprechender

Ferber 24. Nov 2006 15:45

Re: Array zusammenhängen
 
Hi !

Kleine Änderung spart Berechnung innerhalb der Schleife !

Delphi-Quellcode:
procedure TTest.FillArray(var aArray: tBestehendesArray; aValues: array of integer);
var
  TmpLen : integer;
  lp : byte;
begin
  TmpLen := Length(aArray);
  SetLength(aArray,TmpLen+Length(aValues));
  for lp:=TmpLen to TmpLen+high(aValues) do
    aArray[lp] := aValues[lp];
end;

SirThornberry 24. Nov 2006 15:55

Re: Array zusammenhängen
 
Zitat:

Zitat von shmia
Du könntest die Daten effektiver (=schneller) mit der Move Prozedure bewegen.
Aber Achtung: wäre das Array von Typ: array of string; wäre dies verboten.
Deine Prozedure könnte so aussehen (ungetestet!!!):
Delphi-Quellcode:
procedure AppendArray(var aArray: TIntegerArray; aValues: TIntegerArray);
var
  TmpLen : integer;
  lp : byte;
begin
  TmpLen := Length(aArray);
  SetLength(aArray,TmpLen+Length(aValues));
  Move(aValues[0], aArray[TmpLen], Length(aValues)*sizeof(Integer));
end;
Bei Verwendung von Move muss man höchste Vorsicht walten lassen, damit kein Speicher "zerschossen" wird.
PS: ich habe den Namen der Procedure geändert; ist so deutlich sprechender

CopyMemory ruft doch auch nur Move auf. Damit hat man nur das zusätzliche Stack schaufeln wenn man anstelle von Move Copy Memory verwendet.

TomDooley 24. Nov 2006 15:58

Re: Array zusammenhängen
 
Danke an alle! Ich werde in dem Fall Move verwenden. :cheers:

Der_Unwissende 24. Nov 2006 15:59

Re: Array zusammenhängen
 
Zitat:

Zitat von Ferber
Kleine Änderung spart Berechnung innerhalb der Schleife !

Die Schleife an sich ist aber schon das Problem. Einerseits müssen hier wirklich mehrere Aufrufe stattfinden und andererseits wird hier jedes Datum einzeln kopiert. Das kopieren eines Datums kostet aber (unabhängig von dessen Größe) fast immer die gleiche Zeit. Kopiert man also ein Array, so werden die Kosten für das Kopieren der Elemente auf alle Elemente im Array umgelegt, der Overhead ist << als der für das Kopieren in einer Schleife.

Was die Move Prozedur angeht, so greift CopyMemory auch nur auf Move zurück, also ist Move hier noch etwas flinker.

[ADD]
Sorry, kein roter Kasten, komisch
[/ADD]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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