AGB  ·  Datenschutz  ·  Impressum  







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

Dynamische Arrays - Overhead

Ein Thema von blablab · begonnen am 24. Okt 2009 · letzter Beitrag vom 25. Okt 2009
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:01
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:04
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
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:11
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???
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:22
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:34
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
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:38
.. was packst Du denn in Dein Array hinein?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 16:54
Zitat von blablab:
ich hab halt ne tabelle mit 100000 reihen und 25 spalten, die ich anzeigen will...
Und wer will sich das anschauen?
Das sieht nach einem Designfehler aus.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:02
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:02
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Dynamische Arrays - Overhead

  Alt 24. Okt 2009, 17:09
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
"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
Seite 1 von 4  1 23     Letzte »    


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 08:37 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