Domanda Perché struct è migliore con meno di 16 byte


Sto studiando struct; alcuni libri consiglia di creare una struct se ha una dimensione dell'istanza inferiore a 16 byte.

Perché?

Grazie per qualsiasi risposta.


11
2018-03-13 10:01


origine


risposte:


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

Il compilatore ottimizza la copia delle 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 cerchi effettivamente di ottimizzare oltre quel punto nelle versioni più recenti, ma il codice ottimizzato sarà ancora un sacco di istruzioni di movimento, rispetto alla copia di un riferimento a un oggetto che è ancora una singola operazione di spostamento.)

Modificare:
Ecco il risultato di un test che ho fatto sul mio sistema a 64 bit per copiare le strutture 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 vedete, sotto i 16 byte il tempo non è lineare, sebbene 16 byte sia 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.


31
2018-03-13 10:07



Non sono 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 dopo: ho risposto a questa conoscenza molto poco su .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.


1
2018-03-13 10:03