![]() |
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 |
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 ;)
|
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: |
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. |
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 |
Re: Dynamische Arrays - Overhead
.. was packst Du denn in Dein Array hinein?
Grüße Klaus |
Re: Dynamische Arrays - Overhead
Zitat:
Das sieht nach einem Designfehler aus. |
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:
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.
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; 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:
|
Re: Dynamische Arrays - Overhead
Ich hab folgende Datenstruktur:
Delphi-Quellcode:
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
ARR2 = record
cont: Pointer; strs: array of integer; end; ARR1 = array of ARR2; @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. |
Re: Dynamische Arrays - Overhead
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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 by Thomas Breitkreuz