Domanda

Ho un discutibile pratica codifica.

Quando ho bisogno di scorrere un piccolo elenco di elementi di cui è previsto il conteggio è sotto 32000, Io uso Int16 per il mio io tipo di variabile invece di Integer.Faccio questo perché presumo che utilizza il Int16 è più efficiente di un pieno soffiato Integer.

Sono io che sbaglio?Non c'è l'effettiva differenza di prestazioni tra un Int16 vs un Integer?Devo smettere di usare Int16 e solo bastone con Integer per tutti il mio conteggio/iterazione esigenze?

È stato utile?

Soluzione

Secondo il sottostante di riferimento, il runtime ottimizza le prestazioni dei Int32 e li raccomanda per i banchi e gli altri a cui si accede frequentemente operazioni.

Dal libro: MCTS Self-Paced Training Kit (Esame 70-536):Microsoft® .NET Framework 2.0—Application Development Foundation

Capitolo 1:"Quadro"Fondamentali"
Lezione 1:"Utilizzando I Tipi Di Valore"

Best Practices:Ottimizzazione delle prestazioni con il built-in tipi

Il runtime consente di ottimizzare le prestazioni dell'intero a 32 bit tipi (Int32 e UInt32), in modo da utilizzare questi tipi di contatori e altri a cui si accede frequentemente integrale variabili.

Per le operazioni a virgola mobile, il Doppio è il tipo più efficiente in quanto tali operazioni sono ottimizzati per l'hardware.

Inoltre, la Tabella 1-1 nella stessa sezione sono elencati gli usi consigliati per ogni tipo.Pertinente a questa discussione:

  • Int16 - Interoperabilità e altri usi specializzati
  • Int32 - i numeri Interi e contatori
  • Int64 - Grandi numeri interi

Altri suggerimenti

Si dovrebbe quasi sempre utilizzare Int32 o Int64 (e, no, non si ottiene di credito utilizzando UInt32 o UInt64) durante un ciclo su un array o di una raccolta da indice.

Il motivo più ovvio che è meno efficiente è che tutta la matrice e la raccolta di indici trovato nel BCL prendere Int32e, quindi, un cast implicito è sempre succederà nel codice che tenta di utilizzare Int16s come un indice.

Meno evidente la ragione (e la ragione per cui le matrici di prendere Int32 come indice) è che il CIL specifica dice che tutte le operazioni di stack i valori sono sia Int32 o Int64.Ogni volta che si carica o memorizzare un valore a qualsiasi altro tipo integer (Byte, SByte, UInt16, Int16, UInt32, o UInt64), c'è una conversione implicita di intervento.I tipi senza segno di non avere nessuna penalità per il carico, ma per memorizzare il valore, si tratta di un troncamento e un overflow possibile controllare.Per la firma tipi ogni carico segno-si estende, e ogni negozio segno-crolla (e ha un overflow possibile controllare).

Posto che questo sta andando male, di più è il ciclo stesso, non la matrice degli accessi.Per esempio prendere questa innocente loop:

for (short i = 0; i < 32000; i++) {
    ...
}

Sembra buono, giusto?No!Sostanzialmente si può ignorare l'inizializzazione (short i = 0) dato che capita solo una volta, ma il confronto (i<32000) e l'incremento (i++ parti accadere 32000 volte.Ecco alcune pesudo-codice per quello che questo assomiglia a livello della macchina:

  Int16 i = 0;
LOOP:
  Int32 temp0 = Convert_I16_To_I32(i); // !!!
  if (temp0 >= 32000) goto END;
  ...
  Int32 temp1 = Convert_I16_To_I32(i); // !!!
  Int32 temp2 = temp1 + 1;
  i = Convert_I32_To_I16(temp2); // !!!
  goto LOOP;
END:

Ci sono 3 le conversioni che vengono eseguiti 32000 volte.E avrebbero potuto essere evitati utilizzando un Int32 o Int64.

Aggiornamento:Come ho detto nel commento, che ho ora, in realtà scritto un post sul blog su questo argomento, .NETTO Integrale Tipi di Dati E

Int16 può effettivamente essere meno efficiente perché x86 in istruzioni per la parola di accesso più spazio rispetto le istruzioni per dword accesso.Dipenderà da quello che il JIT non.Ma non importa cosa, è quasi certamente non più efficiente quando utilizzato come variabile di iterazione.

È vero il contrario.

32 (o 64) bit interi sono più veloci rispetto int16.In generale, il tipo di dati nativo è il più veloce.

Int16 sono belle se si desidera rendere il vostro dati-strutture il più snello possibile.Questo consente di risparmiare spazio e migliorare le prestazioni.

Nessuna differenza di prestazioni è intenzione di essere così piccolo su hardware moderno che a tutti gli effetti lo farà alcuna differenza.Provare a scrivere un paio di test di sistemi di cablaggio e la loro esecuzione sia centinaia di volte, prendere la media dei loop tempi di completamento, e vedrete cosa intendo.

Potrebbe avere un senso da un deposito di prospettiva se si dispone di risorse molto limitate - sistemi embedded, con un piccolo stack, filo di protocolli progettati per reti lente (ad es.GPRS ecc), e così via.

Mai dare per scontato l'efficienza.

Che cosa è o non c'è più efficiente variano da compilatore a compilatore e la piattaforma a piattaforma.Non hanno testato questa, non c'è modo di dire se int16 o int è più efficiente.

Vorrei solo bastone con int a meno che non si imbatte in una comprovata problema di prestazioni che utilizza int16 correzioni.

Utilizzare Int32 su macchine a 32 bit (o Int64 su macchine a 64-bit) per prestazioni più veloci.Utilizzare un più piccolo numero intero tipo se sei davvero preoccupati per lo spazio che occupa (può essere più lento, però).

Gli altri qui sono corrette, utilizzare solo a meno di Int32 (per codice a 32 bit)/Int64 (per codice a 64-bit) se hai bisogno, per estrema necessità di storage o per un altro livello di esecuzione di un business di campo oggetto (si deve ancora conveniente a livello di convalida in questo caso, naturalmente).

E, in generale, non preoccuparti di efficienza fino a quando c'è un problema di prestazioni.E in quel caso, a profilo.E se indovinate & controllo con entrambi i modi, mentre la profilazione non aiutare abbastanza, controllare il codice.

Buona domanda, però.Stai imparando di più su come il compilatore non è cosa.Se volete imparare a programmare in modo più efficiente, nozioni di base di IL e di come il C#/VB compilatori di fare il loro lavoro sarebbe una grande idea.

Non posso immaginare che ci sia un notevole miglioramento delle prestazioni su Int16 vsint.

È possibile salvare alcuni bit della dichiarazione di variabile.

E sicuramente non vale la pena il fastidio quando le specifiche cambiare, e qualsiasi conteggio può andare al di sopra di 32767 ora e si scopre che quando l'applicazione viene avviata la generazione di eccezioni...

Non c'è un notevole miglioramento delle prestazioni nell'utilizzo di un tipo di dati più piccolo di Int32, infatti, ho letto da qualche parte che l'utilizzo di Int32 sarà più veloce rispetto a Int16 a causa di allocazione di memoria

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top