2010-03-13 15 views
10

Sto studiando la struttura; un libro consiglia di creare una struct se ha una dimensione dell'istanza inferiore a 16 byte.Perché struct è migliore con meno di 16 byte

Perché?

Grazie per qualsiasi risposta.

+0

duplicato di http://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes –

+0

Anche un duplicato di http://stackoverflow.com/questions/2407691/c-struct-design-why-16-byte-is-recommended-size/2407869 # 2407869 – slugster

risposta

28

È perché 16 byte è la soglia in cui il compilatore inizia a copiare le strutture come blocchi di memoria invece di utilizzare una o due istruzioni di spostamento semplici.

Il compilatore ottimizza la copia di strutture quando sono piccole. Una struttura che è ad esempio otto byte può essere copiata come un singolo valore a 64 bit. Una struct di 16 byte può essere una copia di uno o due valori singolari (a seconda dell'architettura del processore). Quando la struttura è più grande di 16 byte, il compilatore non tenta più di ottimizzare la mossa e il fallback consiste nel chiamare un metodo che copia un blocco di memoria.

(Nota: la soglia di 16 byte può variare a seconda della versione del compilatore, sembra che in realtà cerchi di ottimizzare oltre quel punto nelle versioni più recenti, ma il codice ottimizzato sarà ancora un sacco di istruzioni di spostamento, rispetto per la copia di un riferimento a un oggetto che è ancora una sola operazione di spostamento)

Edit:.
Ecco il risultato di un test che ho fatto sul mio struct sistema di copiatura a 64 bit mezzo miliardo di volte:

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. 

Come si vede, sotto i 16 byte il tempo non è lineare, anche se 16 b ytes è quattro volte più di 4 byte, non richiede quattro volte più tempo. Sopra i 16 byte il tempo è lineare, quindi raddoppiando la dimensione raddoppia il tempo. Ecco dove inizierebbe a utilizzare più mosse. Sopra 64 byte c'è un salto, dove il tempo improvvisamente quadruplica quando la dimensione raddoppia. È qui che la riserva verrebbe utilizzata.

+0

fai apparire un punto di vista lucente – Ricky

+0

da dove viene il tuo punto? – Ricky

+0

@Ricky: ho fatto alcuni test nel corso degli anni. Ho aggiunto un risultato del test corrente sopra. – Guffa

1

Non è esattamente 16 byte, ma poiché le strutture vengono passate per valore (copiate ogni volta che le si assegna a un metodo, le si assegna, ecc.) Non devono essere troppo grandi. Se lo sono, passare roba per riferimento è più economico.

4 anni più tardi: ho risposto sapendo molto poco di .NET (ancora non ne so molto). La risposta di Guffa è ovviamente più corretta quando si ha a che fare con "più o meno di 16 byte?", Poiché a quelle dimensioni un po 'di copia non dovrebbe avere molta importanza. La mia risposta potrebbe essere qualcosa da tenere a mente quando si costruiscono enormi strutture.

+0

Un puntatore a 64 bit è ancora più economico di 128 bit di struct. Questa risposta non ha molto senso. – slugster

+2

"Un puntatore a 64 bit è ancora più economico di 128 bit di struct". Perché dici così? L'acquisizione di un puntatore di solito significa allocazione dell'heap e garbage collection costosa su .NET. Scrivere un puntatore implica incorrere in una barriera di scrittura che è anche costosa su .NET. –

+0

@slugster: un riferimento a 8 byte potrebbe essere copiato più a buon mercato di una struttura a 16 byte, ma affinché un riferimento sia utile deve identificare un oggetto sull'heap. Creare un oggetto heap con 16 byte di dati e copiarne un riferimento un milione di volte potrebbe essere più economico rispetto alla copia di una struttura a 16 byte un milione di volte, ma la creazione di un oggetto a 16 byte, copiando il riferimento due volte e abbandonandolo sarà molto più costoso della copia di una struttura a 16 byte due volte (o probabilmente, anche se per la stessa cosa, anche venti volte). – supercat

Problemi correlati