Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays - Overhead (https://www.delphipraxis.net/142251-dynamische-arrays-overhead.html)

blablab 24. Okt 2009 16:01


Dynamische Arrays - Overhead
 
Hallo!

Ich hab folgendes Problem: Ich hab eine mehrdimensionales dynamisches Array ungefähr in folgender größenordnung array[0..100000] of array[0..24]. das äußere array muss wirklich dynamisch sein, die inneren aber eigentlich nicht. deren größe bleibt immer gleich, allerdings weiß ich die größe zur entwicklungszeit noch nicht.
Mein Problem ist nun, dass ich nicht weiß wie die dynamischen arrays bei delphi funktionieren. Aber ich kann mir vorstellen, dass wenn ich Setlength(array, 25) mach, dass delphi dann etwas mehr als 25 speicherplätze reserviert falls ich das array noch nachträglich vergrößere (was ich aber nicht mache).
Wenn jetzt also delphi zb statt 25 speicherplätze immer 30 reserviert, dann wäre das doch ein ziemlich großer overhead...
Diesen overhead, falls es ihn gibt, würde ich gerne verhindern. Was kann ich dagegen tun???

Vielen Dank!
Grüße
blablab

jfheins 24. Okt 2009 16:04

Re: Dynamische Arrays - Overhead
 
Diesen gibt es nicht. Wenn du die Größe auf 25 setzt, wird das auch so gemacht. Das führt natürlich dazu, dass es extrem unperformant ist, die Größe des Array um 1 zu vergrößern - was ja aber nicht dein Problem ist ;)

blablab 24. Okt 2009 16:11

Re: Dynamische Arrays - Overhead
 
ist das wirklich so?
ich hatte teilweise schon das problem, dass ich ein dyn Array immer um 1 vergrößern musste. Da hab ich dann immer extra ne zusätzliche Variable verwendet und das array immer stufenweise zb um 10000 vergrößert. Als ich es dann mit dem verglichen hab dass das Array immer nur um 1 vergrößert hab ich keinen geschwindigkeits-unterschied festgestellt und seit dem vergrößer ich dynamische arrays immer um 1 und mach mir die zusätzliche mühe nicht mehr...
heißt das jetzt ich sollte mir die mühe doch wieder machen??? :stupid:

alzaimar 24. Okt 2009 16:22

Re: Dynamische Arrays - Overhead
 
Die neueren Delphi-Versionen verwenden einen optimierten Speichermanager, sodaß das von jfheins erwähnte Performanceproblem nicht mehr auftritt.

Ohne dein Programm zu kennen würde ich aber annehmen, das im Code mehr Optimierungspotential liegt, als in der Wahl der Datenstruktur.

blablab 24. Okt 2009 16:34

Re: Dynamische Arrays - Overhead
 
ich hab halt ne tabelle mit 100000 reihen und 25 spalten, die ich anzeigen will...
aber statt ca 4 mb braucht die tabelle halt 50mb ram

Klaus01 24. Okt 2009 16:38

Re: Dynamische Arrays - Overhead
 
.. was packst Du denn in Dein Array hinein?

Grüße
Klaus

alzaimar 24. Okt 2009 16:54

Re: Dynamische Arrays - Overhead
 
Zitat:

Zitat von blablab
ich hab halt ne tabelle mit 100000 reihen und 25 spalten, die ich anzeigen will...

:shock: Und wer will sich das anschauen? :gruebel:
Das sieht nach einem Designfehler aus.

himitsu 24. Okt 2009 17:02

Re: Dynamische Arrays - Overhead
 
Gut, dieses Beispiel liefert auch schon in Delphi 7 "theoretisch" sehr gute Ergebnisse,
> im Durchschnitt weniger als 10 kopiervorgänge
also nicht nur in neueren Delphi-Versionen.
Delphi-Quellcode:
Var A: Array of String;
  i, C: Integer;
  P:   Pointer;

Begin
  A := nil;
  C := 0;
  P := Pointer(A);
  For i := 1 to 50000 do Begin
    SetLength(A, i);
    If Pointer(A) <> P Then Inc(C);
    P := Pointer(A);
  End;
  MessageBox(0, PChar(Format('%d von %d wurden kopiert', [C, 50000])), '', 0);
End;
Aber das ist nur ein Optimum, da in der Regel noch andere Speicheroperationen zwischendurch stattfinden und somit vermutlich oftmals der Speicher hinter dem Array belegt sein wird, womit es also dann doch nicht so oft Inplace vergrößert werden kann.


Also, im Prinzip stimmt es, daß hier nicht so der rießige Flaschenhals drinsteckt, wie man glauben könnte,

aber dennoch kann man es im Notfall noch optimieren, durch ein größeres Änderungsintervall.
- seltenere Initialisierungen/Finalisierungen der Elemente (je nach Datentyp)
- auch seltenere Zugriffe auf den Speichermanager
- eventuell auch seltenere Realocierungen ... jenachdem wie optimal es der MM normalerweise machen könnte


Es kommt also auf den Einzel fall drauf an, ob man es noch etwas optimieren kann/muß.


Zitat:

aber statt ca 4 mb braucht die tabelle halt 50mb ram
Stichwort Speicherfragmentierung

blablab 24. Okt 2009 17:02

Re: Dynamische Arrays - Overhead
 
Ich hab folgende Datenstruktur:

Delphi-Quellcode:
ARR2 = record
   cont: Pointer;
   strs: array of integer;
end;
ARR1 = array of ARR2;
Den befüll ich zur Zeit mit 32000 Zeilen und 24 Spalten. -> Ich brauch 88MB Arbeitsspeicher (Differenz zwischen Array befüllen und SetLength(ARR1, 0)). Wenn ich mich nicht verrechne sollte das ganze aber um die 32000*(1+24)*4 =~ 3MB brauchen


@alzaimar:
Sorry, dass ich das net weiter rechtfertige, aber es ist kein Designfehler...
Aber darum gehts ja auch net. ich will einfach net das 30-fache an Speicher benötigen.

Medium 24. Okt 2009 17:09

Re: Dynamische Arrays - Overhead
 
Zitat:

Zitat von blablab
ich will einfach net das 30-fache an Speicher benötigen.

Beste Methode: Hol dir auch nur das in den Speicher, was auch angezeigt wird (evtl. +/- etwas am "Rand" prefetchen). Das löst auch gleich dein nicht existentes Designproblem ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 Uhr.
Seite 1 von 4  1 23     Letzte »    

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