C'è un vantaggio pratico nell'usare il tipo di dati più piccolo possibile?

3

In C # (e in altre lingue), possiamo definire una variabile numerica come short , int o long (tra gli altri tipi), principalmente a seconda di quanto ci aspettiamo che i numeri ottengano . Molte operazioni matematiche (ad es., Aggiunta + ) valutano un intero ( int ), e quindi richiedono un cast esplicito per archiviare il risultato in una short , anche quando si opera su due shorts . È molto più facile (e probabilmente più leggibile) utilizzare semplicemente int s, anche se non ci si aspetta mai che i numeri superino la capacità di memorizzazione di un short . Infatti, sono sicuro che la maggior parte di noi scrive for loop usando int contatori, invece che short contatori anche quando sarebbe sufficiente un short .

Si potrebbe sostenere che l'utilizzo di int è semplicemente a prova di futuro, ma ci sono certamente casi in cui sappiamo che short sarà abbastanza grande.

C'è un vantaggio pratico nell'usare questi tipi di dati più piccoli, che compensa la fusione aggiuntiva necessaria e diminuisce la leggibilità? O è più pratico usare semplicemente int ovunque, anche quando siamo sicuri che i valori non supereranno mai la capacità di short (ad es. Il numero di assi su un grafico)? O il vantaggio si realizza solo quando abbiamo assolutamente bisogno dello spazio o delle prestazioni di quei tipi di dati più piccoli?

Modifica per l'indirizzo dupes:

Questo è vicino, ma è troppo ampio - e parla più alle prestazioni della CPU rispetto alle prestazioni della memoria (anche se ci sono molti paralleli).

Questo è vicino, ma non arriva all'aspetto pratico della mia domanda. Sì, ci sono momenti in cui l'uso di short è appropriato, che la domanda fa un buon lavoro di illuminazione. Ma, appropriato non è sempre pratico, e l'aumento delle prestazioni (se ce ne sono) potrebbe non essere effettivamente realizzato.

    
posta mmathis 22.03.2018 - 22:35
fonte

5 risposte

6

Riguardo ai tipi primitivi quando sentiamo che dobbiamo usarli:

Le variabili locali generalmente si comportano alla stessa velocità o leggermente peggio quando si usano tipi di dati più piccoli, quindi questo è da zero a valore negativo nel contesto delle dichiarazioni - cioè for , while e contatori associati & variabili del ciclo, nonché gli altri locali e anche i parametri. Inoltre, dovresti provare a utilizzare la dimensione nativa int che ha le stesse dimensioni dei puntatori oppure rischi di avere un overflow numerico durante l'iterazione su raccolte di dimensioni arbitrarie.

L'unico posto in cui prendere in considerazione se stessi con dimensioni primitive più piccole è nelle strutture di dati che hanno volumi di oggetti molto elevati. Anche lì, la maggior parte delle lingue ha una dimensione minima dell'oggetto che ha a che fare con l'allineamento nell'allocazione della memoria. Quindi, l'utilizzo di un singolo short rispetto a un singolo int non può comprare nulla (a seconda dell'implementazione linguistica) perché lo spazio non utilizzato va semplicemente al padding orientato all'allineamento, mentre l'utilizzo di due short s può spesso risparmiare spazio su due int s perché short s può essere compresso insieme.

    
risposta data 22.03.2018 - 23:40
fonte
3

Erik Eidt ha fornito il caso principale in cui devono essere utilizzati piccoli tipi di dati: grandi matrici di essi.

Tuttavia, vi è un altro caso in cui vale la pena - quando si dispone di alcuni megabyte in una struttura dati a cui si accede molto pesantemente. Il problema qui è la cache della CPU: vi è un notevole vantaggio dal mantenere i dati di lavoro nella cache piuttosto che dover andare alla memoria principale. I tempi in cui questo è rilevante sono bassi.

    
risposta data 23.03.2018 - 02:12
fonte
2

Ci sono molti formati di file che usano effettivamente cortometraggi e altri tipi di piccoli tipi di dati. Se hai bisogno di leggere un campo definito come breve, non vuoi leggere un int, perché questo ti darebbe dati che non appartengono a questo campo.

    
risposta data 22.03.2018 - 22:44
fonte
2

È improbabile che vi sia alcun beneficio a meno che non sia possibile prevedere decine di milioni di byte "salvati". ie; grandi matrici o più elementi abbreviati sono impacchettati in strutture per le quali coesistono milioni di copie. Nota che solo dichiarare un gruppo di variabili di byte in una struttura non garantisce che saranno impacchettate - i compilatori e le lingue cambiano il modo in cui gestiscono ciò.

    
risposta data 23.03.2018 - 18:04
fonte
-1

Naturalmente. Raddoppiare la dimensione dei tuoi tipi di dati potrebbe raddoppiare la quantità di RAM necessaria, il che potrebbe rendere inutilizzabile il tuo programma. Tutto dipende da quante istanze hai bisogno nella RAM.

A volte non è un'ottimizzazione, ma piuttosto un segnale all'utente API che un valore deve essere in un determinato intervallo.

    
risposta data 22.03.2018 - 23:04
fonte

Leggi altre domande sui tag