2010-03-13 18 views
10

Ich studiere struct; Einige Bücher empfehlen, struct zu erstellen, wenn die Instanz kleiner als 16 Bytes ist.Warum ist Struktur besser mit weniger als 16 Bytes

Warum?

Danke für jede Antwort.

+0

Duplikat von http://stackoverflow.com/questions/1082311/why-should-a-net-struct-bel-less-than-16-bytes –

+0

Auch ein Betrüger von http://stackoverflow.com/questions/2407691/c-struct-design-why-16-byte-is-recommended-size/2407869 # 2407869 – slugster

Antwort

28

Es ist, weil 16 Bytes der Schwellenwert ist, wo der Compiler beginnt, Strukturen als Speicherblock zu kopieren, anstatt eine oder zwei einfache Verschiebungsanweisungen zu verwenden.

Der Compiler optimiert das Kopieren von Strukturen, wenn sie klein sind. Eine Struktur, die beispielsweise acht Bytes umfasst, kann als einzelner 64-Bit-Wert kopiert werden. Eine Struktur mit 16 Byte kann als ein oder zwei Singularwerte kopiert werden (abhängig von der Prozessorarchitektur). Wenn die Struktur größer als 16 Byte ist, versucht der Compiler nicht mehr, die Verschiebung zu optimieren, und das Ausweichverfahren besteht darin, eine Methode aufzurufen, die einen Speicherblock kopiert.

(Hinweis: die Schwelle von 16 Bytes kann je nach Version des Compilers unterschiedlich sein, es scheint in den neueren Versionen zu versuchen, darüber hinaus zu optimieren, aber der optimierte Code wird immer noch viele Verschiebungsanweisungen verglichen einen Verweis auf ein Objekt zu kopieren, die noch eine einzige Verschiebeoperation ist)

Edit:.
Hier ist das Ergebnis eines Tests ist, dass ich auf meinem 64-Bit-System Kopieren structs hat eine halbe Milliarde mal:

struct 4 : 272 ms. 
struct 8 : 235 ms. 
struct 16 : 317 ms. 
struct 32 : 625 ms. 
struct 64 : 1280 ms. 
struct 128 : 4659 ms. 
struct 256 : 8020 ms. 

Wie Sie sehen, ist unter 16 Bytes die Zeit nicht linear, obwohl 16 b ytes ist viermal so viel wie 4 Bytes, es dauert nicht viermal länger. Über 16 Bytes ist die Zeit linear, also verdoppelt sich die doppelte Zeit. Dort würde es anfangen, mehrere Züge zu benutzen. Ab 64 Bytes gibt es einen Sprung, bei dem sich die Zeit plötzlich verdoppelt, wenn sich die Größe verdoppelt. Dort würde der Fallback eingesetzt werden.

+0

Sie bringen einen klaren Blickwinkel auf – Ricky

+0

Woher kommt Ihr Standpunkt? – Ricky

+0

@Ricky: Ich habe im Laufe der Jahre einige Tests gemacht. Ich habe oben ein aktuelles Testergebnis hinzugefügt. – Guffa

1

Es ist nicht genau 16 Bytes, aber weil Strukturen nach Wert übergeben werden (kopiert, wann immer Sie sie einer Methode zuweisen, zuweisen, etc.), dürfen sie nicht zu groß sein. Wenn sie sind, ist das Übergeben von Sachen durch Referenz billiger.

4 Jahre später: Ich antwortete dies nur sehr wenig über .NET (weiß immer noch nicht viel darüber). Guffas Antwort ist offensichtlich korrekter, wenn es sich um "mehr oder weniger als 16 Bytes" handelt, da bei dieser Größe ein bisschen Kopieren nicht viel ausmachen sollte. Meine Antwort kann etwas sein, das man beim Aufbau riesiger Strukturen beachten sollte.

+0

Ein 64-Bit-Zeiger ist immer noch billiger als 128 Bit Struktur. Diese Antwort macht nicht wirklich viel Sinn. – slugster

+2

"Ein 64-Bit-Zeiger ist immer noch billiger als 128 Bit Struktur". Warum sagst du das? Das Erfassen eines Zeigers bedeutet normalerweise eine Heap-Zuweisung und eine Garbage-Collection, die für .NET teuer ist. Das Schreiben eines Zeigers bedeutet, dass eine Schreibbarriere entsteht, die für .NET ebenfalls teuer ist. –

+0

@sugster: Eine 8-Byte-Referenz könnte billiger als eine 16-Byte-Struktur kopiert werden, aber damit eine Referenz nützlich sein kann, muss sie ein Objekt auf dem Heap identifizieren. Das Erstellen eines Heap-Objekts mit 16 Datenbytes und das Kopieren einer millionenfachen Referenz ist möglicherweise billiger als das Kopieren einer 16-Byte-Struktur millionenfach, aber das Erstellen eines 16-Byte-Objekts, das Kopieren des Verweises zweimal und das Aufgeben des Objekts viel teurer als das Kopieren einer 16-Byte-Struktur zweimal (oder wahrscheinlich sogar zwanzig Mal). – supercat

Verwandte Themen