2012-01-22 16 views
9

Recentemente ho imparato che ogni ciclo di calcolo viene eseguito su parole macchina che sulla maggior parte dei processori e sistemi operativi contemporanei sono a 32 bit o 64 bit. Quindi quali sono i vantaggi dell'utilizzo di valori di dimensioni in bit più piccoli come Int16, Int8, Word8? Per cosa sono esattamente? È solo la riduzione dello spazio di archiviazione?Utilizzo di tipi interi a basso bit come `Int8` e cosa sono per

Scrivo un programma di calcolo complesso costituito da diversi moduli ma è interfacciato solo da una singola funzione che restituisce un valore Word64, pertanto l'intero programma restituisce il valore Word64. Sono interessato alla risposta a questa domanda perché all'interno di questo programma mi sono trovato a utilizzare molti tipi diversi Integral come Word16 e Word8 per rappresentare piccole entità, e visto che abbastanza spesso sono stati convertiti con fromIntegral mi ha fatto pensare: stavo facendo un errore lì e qual è stato il beneficio esatto di quei tipi di cui non ero a conoscenza attratto ciecamente? Ha senso utilizzare tutti gli altri tipi di integrali e convertirli in modo evetivo con fromIntegral o forse avrei dovuto usare solo Word64 ovunque?

risposta

6

Questi tipi più piccoli offrono una riduzione della memoria solo quando li si archivia in matrici unboxed o simili. Lì, ognuno prenderà il numero di bit indicato dal suffisso del tipo.

In uso generale, tutti prendono esattamente quanto memorizzazione come Int o Word, la differenza principale è che i valori sono ridotte automaticamente alla dimensione appropriata bit quando si usano tipi larghezza fissa, e ci sono (ancora) più ottimizzazioni (principalmente sotto forma di regole di riscrittura) per Int e Word rispetto a Int8 ecc., quindi alcune operazioni saranno più lente.

Riguardo alla questione se utilizzare Word64 in tutto o utilizzare tipi più piccoli, dipende. Su un sistema a 64 bit, durante la compilazione con ottimizzazioni, le prestazioni di Word e Word64 dovrebbero essere per lo più le stesse, poiché dove è importante entrambe devono essere decompresse e il lavoro viene eseguito sulla macchina raw Word#. Ma probabilmente ci sono ancora alcune regole per Word che non hanno ancora la controparte Word64, quindi forse c'è una differenza dopo tutto.Su un sistema a 32 bit, la maggior parte delle operazioni su Word64 vengono implementate tramite chiamate C, pertanto le operazioni su Word64 sono molto più lenta di rispetto alle operazioni su Word.

Quindi, a seconda di ciò che è più importante, la semplicità del codice o prestazioni su sistemi diversi, sia

  1. uso Word64 tutto: semplice codice, buone prestazioni su sistemi a 64 bit
  2. uso Word il più a lungo i tuoi valori sono garantiti per adattarsi a 32 bit e trasformarsi in Word64 all'ultimo momento sicuro: codice più complicato, ma prestazioni migliori su sistemi a 32 bit.
+0

Grazie, Daniel! Per favore considera il commento che ho lasciato alla risposta di Ehird. Dal momento che in genere le tue risposte sono simili, si rivolge anche a te. –

+0

Risposta aggiornata. A seconda della tua situazione e dei tuoi obiettivi, potrei non essere d'accordo con ehird. –

8

In GHC, i tipi di interi a dimensione fissa riprendono una parola macchina completa, quindi non è possibile risparmiare spazio. Nella maggior parte dei casi, i tipi di dimensioni di una parola macchina (ad esempio Int e Word) saranno probabilmente più veloci dei tipi a dimensione fissa, ma l'utilizzo di un tipo integrale di dimensioni fisse sarà più veloce di un wrap-around esplicito.

È necessario scegliere il tipo appropriato per l'intervallo di valori che si sta utilizzando. maxBound :: Word8 è 255, 255 + 1 :: Word8 è 0 - e se hai a che fare con gli ottetti, è esattamente quello che vuoi. (Ad esempio, ByteString s sono definiti come memorizzazione Word8 s.)

Se si dispone solo di numeri interi che non richiedono un numero specifico di bit, e i calcoli che si stanno facendo non eccederanno, solo utilizzare Int o Word (o anche Integer). I tipi di dimensioni fisse sono meno comuni dei tipi integrali regolari perché, nella maggior parte dei casi, non è necessaria una dimensione specifica.

Quindi, non usarli per le prestazioni; usali se stai cercando la loro semantica specifica: tipi di integrale a dimensione fissa con comportamento di overflow definito.

+0

Come sempre tu e Daniel in soccorso!) Ok, quindi generalmente "Int" e "Word" sono migliori di quei piccoli tipi - ho capito. Ma per quanto riguarda la seconda domanda che stavo sottolineando: sarà ancora più efficace eseguire tutte le operazioni intrinseche in 'Word' se so che alla fine avrei ancora bisogno di ricampionare quei valori a' Word64', o fa ha senso in questo scenario usare semplicemente 'Word64' dappertutto sin dall'inizio e risparmiare così alcuni cicli eliminando le conversioni' fromIntegral'? –

+1

Se si mira a produrre un risultato 'Word64', userei' Word64' anche per i calcoli intermedi. Su una macchina a 64 bit, sarà una parola macchina, quindi non ci dovrebbero essere problemi di prestazioni, e 'fromIntegral' sarà un NOP in fase di runtime. – ehird

+0

Nessun risparmio di spazio? Ho pensato che con bangpatterns avrebbero risparmiato spazio nei costruttori di dati. – user239558

Problemi correlati