Laden...

Stack-Größe ausreichend für viele structs?

Erstellt von steschu vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.422 Views
steschu Themenstarter:in
24 Beiträge seit 2009
vor 14 Jahren
Stack-Größe ausreichend für viele structs?

Hallo,

Ich plane eine Struct "Coordinate" zu erstellen, die ein Koordinaten-Paar darstellt (polare Koordinaten). Dazu gibt es noch ein paar Methoden - alles so ein bisschen ähnlich wie DateTime.

Jetzt sind ja Structs Wertetypen, die auf dem Stack verwaltet werden, was Performance-Vorteile bringt. Was ich aber nicht ganz verstehe ist, wieviel Instanzen der Stack so verträgt? Welche Größe hat der Stack bzw. kann man ihn ggf. vergrößern?

Im konkreten Fall können schon einmal mehrere zehntausend Coordinate Objekte instanziert werden, um das Endprodukt (eine Karte) angezeigt zu bekommen...

Viele Grüße,
Stephan

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo steschu,

willkommen bei MyCSharp.de

Ein Thread hat normalerweise einen Stack von 1MB
Guckst du hier: Thread Constructor (ThreadStart, Int32)

Das hängt jetzt von der größe deiner Struktur ab.
Musst du halt rechnen wieviel du da platz brauchst.

Wobei ich kein Fan von Stukturen bin. Damit kann man auch lustige Probleme kriegen, z.B. wenn man diese in ne Liste knallt

SIehe dazu: Struct vs. Class

Also ich würde dafür eine Class erstellen

Gruss
Michael

6.862 Beiträge seit 2003
vor 14 Jahren

... z.B. wenn man diese in ne Liste knallt...

Genau das nehm ich aber fast an. Wenn er sagt, mehrere Zehntausend Objekte die angezeigt werden, heißt es ja dass die irgendwo in einer Aufzählung gespeichert werden müssen, und die ganzen verschiedenen Aufzählungstypen sind ja alles Referenztypen. Damit erledigt sich das "Problem" mit der Stackgröße eh, weil die Wertetypen dann auch aufn Heap gepackt werden.

Baka wa shinanakya naoranai.

Mein XING Profil.

99 Beiträge seit 2006
vor 14 Jahren

Strukturen in Kollektionen werden genauso behandelt wie Werttypen als Parameter in Funktionen - es wird an ihren Kopien gearbeitet. Generel man kann mit gutem Gewissen annehmen, wenn ein Objekt aus max. 8 bytes besteht, kann man es als eine struktur bauen. z.B. Point was aus zwei int Koordinaten besteht.

F
10.010 Beiträge seit 2004
vor 14 Jahren

Falsch.
Dies ist der typische Fehler "premature optimisation".
Also viele Probleme in Kauf nehmen, um evtl einen Vorteil zu haben.

99 Beiträge seit 2006
vor 14 Jahren

was genau meinst du FZelle?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo steschu, hallo idzik,

Jetzt sind ja Structs Wertetypen, die auf dem Stack verwaltet werden, was Performance-Vorteile bringt.

die Performance sollte nicht das Kriterium dafür sein, ob man eine class oder einen struct verwendet. Das einzige Kriterium sollte sein, ob es sich konzeptuell um einen reinen Wert oder um ein Objekt (mit Identität) handelt.

Coordinate ist wohl allerdings konzeptuell ein Werttyp.

Davon abgesehen liegen structs nicht zwangsläufig auf dem Stack. Wenn man eine List<Coordinate> erzeugt und 100.000 Elemente hinzufügt, liegt nichts auf dem Stack, abgesehen vielleicht von einer mickrigen Referenz auf die Liste.

was genau meinst du FZelle?

Ich bin nicht FZelle, aber der Satz lautet komplett "premature optimization is the root of all evil". Und was das heißt, sollte klar sein. 😃 Wenn nicht hilft http://lmgtfy.com/?q=premature+optimisation trotz der ungewöhlichen, weil britischen Schreibweise 😃

herbivore

steschu Themenstarter:in
24 Beiträge seit 2009
vor 14 Jahren

Hi,

Erstmal vielen Dank für die zahlreichen Antworten.

die Performance sollte nicht das Kriterium dafür sein, ob man eine class oder einen struct verwendet. Das einzige Kriterium sollte sein, ob es sich konzeptuell um einen reinen Wert oder um ein Objekt (mit Identität) handelt.

Coordinate ist wohl allerdings konzeptuell ein Werttyp.

Ja, genau deswegen wollte ich eine Struct nehmen...

Sehe ich das richtig, dass der Fall, dass mehrere Zig-Tausend Instanzen meiner Struct-Coordinate auf dem Stack liegen, nur eintreten würde, wenn ich sie einzeln im Code deklarieren würde?

Der Normalfall dürfte ja sein, dass man in einer Schleife, die Ausgangswerte aus einer Datenquelle liest, eine struct erzeugt und sie in der Schleife auch dann gleich an das abbildende Grafikobjekt weitergibt oder eben in eine Collection schiebt. Ein Kopie der Strcut wird damit übergeben (und wandert auf den Heap) und die eigentliche struct existiert nur im jeweiligen Schleifendurchgang... richtig?

Stephan

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo steschu,

Sehe ich das richtig, dass der Fall, dass mehrere Zig-Tausend Instanzen meiner Struct-Coordinate auf dem Stack liegen, nur eintreten würde, wenn ich sie einzeln im Code deklarieren würde?

einzeln als lokale Variablen, ja.

und die eigentliche struct existiert nur im jeweiligen Schleifendurchgang... richtig?

Zumindest gibt es nur einen Struct auf dem Stack, wenn nur eine lokale Variable deklariert ist.

herbivore

1.130 Beiträge seit 2007
vor 14 Jahren

einzeln als lokale Variablen, ja.

Ausnahme: Rekusrion

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

99 Beiträge seit 2006
vor 14 Jahren

schon gelesen über premature optimization 😉
@steschu - es handelt sich wohl um eine lineare verarbeitung, also der algorithmus könnte so aussehen

IList<MyStruct> dataList = createDataList();
foreach(var data in dataList)
{
    drawData(data);
}

fange an mit MyStruct als struct, mach mal performance tests vor und nach der schleife, und danach ändere struct in class und wiederhole die tests. sag bescheid wie lange dauert die schleife. für die zeit-messung kannst du System.Diagnostics.Stopwatch benutzen.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo idzik,

die Messung wird nur ergeben, dass es keinen oder kaum einen Unterschied macht. Das aufwändige ist das Zeichnen selbst. Wie schon gesagt, sollte man sich von der Performance ohnehin nicht leiten lassen, sondern eine konzeptionelle Entscheidung treffen.

herbivore