2015-09-23 18 views
6

Sto scrivendo un'applicazione in cui le prestazioni sono abbastanza critiche. Sono un po 'confuso su quale sia il tipo di dati più efficiente per le CPU x64.Codice efficiente: tipi di dati short vs integer in VB.Net

MDSN dice che "In some cases, the common language runtime can pack your Short variables closely together and save memory consumption." ma anche che "The Integer data type provides optimal performance on a 32-bit processor"

sto usando un enorme quantità di dati (in media circa 5 milioni di valori in una matrice irregolare [10 o più] [30] [128.128]) per generare immagini bitmap in tempo reale (mappe di calore dei valori dei dati). Tutti i punti di dati sono numeri interi compresi tra 200 e 3500, quindi posso usare breve o intero. Quale sarebbe più efficiente?

Grazie.

+2

Che cosa significa "enorme"? Sei a rischio di ottenere un 'OutOfMemoryException' con numeri interi? Altrimenti usa interi, una CPU è progettata per funzionare in modo efficiente con valori a 32 bit. –

+0

In media 128 * 128 * 30 * 10 valori di dati (4915200) in una matrice seghettata. L'utilizzo della memoria è OK, circa 230 MB sulla mia macchina, che è una specifica media per l'azienda. La ragione per cui la sto chiedendo è perché sto facendo una manipolazione in tempo reale delle immagini (cambiando tonalità e così via), quindi ho bisogno che sia il più efficiente possibile. – Absinthe

+0

Se si desidera un footprint di memoria più piccolo per i dati grezzi, utilizzare short. Se si desidera un rendering più veloce delle immagini, un altro tipo di dati potrebbe essere la scelta corretta, ma non esiste un codice da esaminare che mostri come vengono utilizzati i dati. – dbasnett

risposta

0

Come regola generale, minore è la quantità di memoria utilizzata da una variabile, maggiore sarà la velocità con cui verrà elaborato e si avrà una migliore gestione della memoria perché l'applicazione ne utilizzerà una quantità inferiore.

Breve richiede solo la metà dei numeri interi di memoria necessari, se è necessario solo un numero di 16 bit e si è certi che non sarà mai più grande, utilizzare Short.

+1

Grazie per la risposta. Sarebbe stato bello da chi ha valutato questo giù per spiegare perché. – Absinthe

1

Il tipo Int32 è più efficiente per le variabili regolari, ad esempio i contatori di loop, sia nelle applicazioni a 32 bit che a 64 bit.

Quando si gestiscono grandi matrici di dati, l'efficienza di lettura/scrittura di un singolo valore non importa molto, ciò che conta è accedere ai dati in modo da ottenere il minor numero possibile di cache di memoria. Una mancanza della memoria cache è molto costosa rispetto ad un accesso alla memoria cache. (Inoltre, un errore di pagina (memoria scambiata su disco) è molto costoso rispetto a una mancanza di memoria cache.)

Per evitare errori di cache è possibile memorizzare i dati il ​​più possibile compatti e quando si elaborano i dati è possibile accedere a il più linearmente possibile in modo che l'area di memoria a cui si accede sia il più piccola possibile.

L'utilizzo di Int16 è probabilmente più efficiente di Int32 per qualsiasi array sufficientemente grande da estendersi su più blocchi di cache e un blocco di cache è in genere di pochi kilobyte.

Poiché i valori sono possibili da memorizzare in soli 12 bit, potrebbe anche essere più efficiente memorizzare ogni valore in 1,5 byte, anche se ciò significa più elaborazione per gestire i dati. La riduzione del 25% delle dimensioni dei dati potrebbe più che compensare l'elaborazione extra.

+0

Grazie per la risposta. Io uso un ciclo (stepping 1) per ogni dimensione dell'array per iterare gli elementi, quindi presumo che questo porti ad un accesso abbastanza lineare. Puoi chiarire "potrebbe persino essere più efficiente memorizzare ogni valore in 1.5 byte" - come faresti? Data la varietà di risposte, penso che sia meglio testare ogni opzione :) – Absinthe

+0

@Absinthe: poiché ovviamente non esiste un tipo di dati di 1,5 byte, si memorizzerebbe un valore in parti di due byte o più valori in un dato più grande genere. È possibile memorizzare i valori a 12 bit 'a' e' b' in tre byte: 'aaaaaaaa aaaabbbb bbbbbbbb'. È inoltre possibile memorizzare cinque valori (60 bit) in un 'Int64' (8 byte) con quattro bit inutilizzati. Per leggere un valore di valore a 12 bit dall'array 'Int64' si usa' (arr [i/5] >> ((i% 5) * 12)) e 0xFFF'. – Guffa