2009-02-10 14 views
9

Durante la lettura attraverso il kit di formazione 70-536, si afferma:.NET ottimizzata Int32

Il runtime ottimizza le prestazioni dei tipi interi a 32 bit (Int32), in modo utilizzare questi tipi per i contatori e altre variabili integrate con accesso frequente .

Questo si applica solo in un ambiente a 32 bit? Int64 prende il sopravvento in un ambiente a 64 bit o Int32 è ancora la scelta migliore?

+0

Interessante domanda – juan

risposta

1

A meno che non si preveda di avere un valore superiore a 2 miliardi, utilizzare un valore intero. Non vi è alcun motivo per utilizzare uno spazio aggiuntivo per un beneficio prestato dalle prestazioni.

E contrariamente a quello che possono dire gli altri su questo thread, finché non si misura il beneficio di una cosa tanto piccola come questa, è solo un beneficio percepito.

6

Questo è un modo divertente per dirlo. Il runtime non ha molto a che fare con questo. La CPU è progettata per l'elaborazione di numeri interi a 32 bit, motivo per cui sono i più efficienti da utilizzare.

In un ambiente a 64 bit, dipende ancora dalla CPU. Tuttavia, almeno sulla CPU x86 (che, per quanto ne so, è l'unico posto su cui gira .NET), i numeri interi a 32 bit sono ancora predefiniti. I registri sono stati semplicemente espansi in modo che possano adattarsi a un valore a 64 bit. Ma 32 è ancora il default.

Quindi preferisco numeri interi a 32 bit, anche in modalità 64 bit.

Modifica: "default" probabilmente non è la parola giusta. La CPU supporta solo una serie di istruzioni, che definiscono quali tipi di dati può elaborare e quali non possono. Non c'è "default" lì. Tuttavia, generalmente c'è una dimensione dei dati che la CPU è progettata per elaborare in modo efficiente. E su x86, in modalità a 32 e 64 bit, sono interi a 32 bit. I valori a 64 bit non sono generalmente più costosi, ma indicano istruzioni più lunghe. Credo inoltre che almeno i Pentium 4 a 64 bit siano stati notevolmente più lenti con le operazioni a 64 bit, anche se su CPU recenti, quella parte non dovrebbe essere un problema. (Ma la dimensione dell'istruzione potrebbe essere ancora)

Più piccoli dei valori a 32 bit sono leggermente più sorprendenti. Sì, ci sono meno dati da trasferire, il che è buono, ma la CPU continua a prendere 32 byte alla volta. Il che significa che deve mascherare parte del valore, quindi questi diventano ancora più lenti.

+0

Non esiste un tipo di dati integrale "predefinito" dal punto di vista della CPU, "digitazione" è limitato dai codici di registro legale. –

+0

vero. Per impostazione predefinita intendo le dimensioni dei dati che la CPU può elaborare in modo più efficiente. Meno di 32 bit significa più lavoro nelle operazioni load/store (perché parte della lettura/scrittura deve essere mascherata), e più grande di 32-bit richiede istruzioni più lunghe (e potrebbe, in alcune CPU, anche essere più lente di per sé) – jalf

+0

Esiste una distribuzione .NET per x64. – Cheeso

1

http://en.wikipedia.org/wiki/64-bit suggerisce (si potrebbe trovare una fonte più autorevole, questo è il primo che ho trovato) che le offerte "a 64 bit" di Microsoft utilizzano puntatori a 64 bit coninteri a 32 bit.

http://www.anandtech.com/guides/viewfaq.aspx?i=112 (e io non so come degno di fiducia è) dice,

Al fine di mantenere il codice gonfiare al minimo, AMD imposta in realtà la dimensione dei dati di default operando a 32-bit in la modalità di indirizzamento a 64 bit. La motivazione è che gli operandi dei dati a 64 bit non sono probabilmente necessari e potrebbero danneggiare le prestazioni; in quelle situazioni in cui gli operandi dati a 64 bit sono desiderati, possono essere attivati ​​usando il nuovo prefisso REX (woohoo, ancora un altro prefisso di istruzioni x86 :)).

+0

Ho visto anche questo –

+0

In MSVC, long long è un numero intero a 64 bit. –

-2

Una CPU a 32 bit gestisce gli interi a 32 bit più velocemente.Uno a 64 bit gestisce gli interi a 64 bit più velocemente; pensateci: o dovete spostare i bit di 32 bit tutto il tempo, o sprecare 32 bit per ogni 32 bit, che è essenzialmente lo stesso di usare una variabile a 64 bit senza i vantaggi di una variabile a 64 bit. Un'altra opzione consisterebbe nel creare circuiti aggiuntivi nella CPU in modo tale che il cambio non fosse necessario, ma ovviamente ciò aumenterebbe i costi di produzione. Lo stesso vale per le CPU a 32 bit che gestiscono variabili a 16 o 8 bit.

Non sono sicuro, ma non sarei sorpreso se la variante a 64 bit di .NET Framework fosse un po 'più ottimizzata per l'uso dei long - ma è solo una mia speculazione.

+0

Stai affermando che le CPU a 64 bit gestiscono gli interi a 64 bit più velocemente degli interi a 32 bit: ma non è solo una speculazione da parte tua? – ChrisW

+0

ChrisW: Non hai letto attentamente la mia risposta. Non ho speculato; Ho spiegato che per evitare il degrado delle prestazioni dovuto al disallineamento, è necessario eseguire il rilievo dei numeri interi a 32 bit con 32 bit in più. Questa non è speculazione, questo è un fatto ben noto. –

2

Scott Hanselman ha pubblicato oggi un articolo che affronta le differenze tra codice gestito a 32 e 64 bit nel suo blog. Per riassumere fondamentalmente solo i puntatori cambiano le dimensioni, gli interi sono ancora a 32 bit.

È possibile trovare il post here.

Problemi correlati