2012-01-22 11 views
9

Recientemente he aprendido que cada ciclo de cálculo funciona en palabras de máquina que en la mayoría de los procesadores y sistemas operativos contemporáneos son de 32 bits o de 64 bits. Entonces, ¿cuáles son los beneficios de utilizar los valores más pequeños de tamaño de bit como Int16, Int8, Word8? ¿Para qué son exactamente? ¿Es solo reducción de almacenamiento?Utilizando tipos enteros de bit bajo como `Int8` y lo que son para

Escribo un programa de cálculo complejo que consta de varios módulos pero está interconectado por una sola función que devuelve un valor Word64, por lo que el programa completo da como resultado el valor Word64. Estoy interesado en la respuesta a esta pregunta porque dentro de este programa me encontré utilizando muchos tipos diferentes de Integral como Word16 y Word8 para representar entidades pequeñas, y viendo que con frecuencia se convertían con fromIntegral me hizo pensar: ¿estaba haciendo un error allí y ¿cuál fue el beneficio exacto de esos tipos que desconocía que atrajeron ciegamente? ¿Tenía algún sentido utilizar otros tipos integrales y convertirlos evetually con fromIntegral o quizás debería haber usado Word64 en todas partes?

Respuesta

6

Estos tipos más pequeños le dan una reducción de memoria solo cuando los almacena en matrices sin caja o similares. Allí, cada uno tomará la cantidad de bits que indique el sufijo de tipo.

En el uso general, que todos toman exactamente tanto de almacenamiento como un Int o Word, la principal diferencia es que los valores se reducen automáticamente al tamaño de bit correspondiente al utilizar tipos de ancho fijo, y no son (todavía) más optimizaciones (en forma de reglas de reescritura principalmente) para Int y Word que para Int8 etc., por lo que algunas operaciones serán más lentas al utilizarlas.

En lo que respecta a la cuestión de si utilizar Word64 en todo o para utilizar tipos más pequeños, eso depende. En un sistema de 64 bits, al compilar con optimizaciones, el rendimiento de Word y Word64 debería ser el mismo, ya que cuando importa, ambos deben desempaquetarse y el trabajo debe realizarse en la máquina sin procesar Word#. Pero es probable que aún existan algunas reglas para Word que aún no tienen contrapartida Word64, por lo que quizás haya una diferencia después de todo.En un sistema de 32 bits, la mayoría de las operaciones en Word64 se implementan a través de llamadas C, por lo que las operaciones en Word64 son mucho más lentas que las operaciones en Word.

Así que dependiendo de lo que es más importante, la sencillez de código o el rendimiento en sistemas diferentes, ya sea

  1. uso Word64 largo: código simple, buen rendimiento en sistemas de 64 bits
  2. uso Word, siempre y cuando sus valores están garantizados para encajar en 32 bits y transformar a Word64 en el último momento seguro: código más complicado, pero mejor rendimiento en sistemas de 32 bits.
+0

¡Gracias, Daniel! Por favor, considere el comentario que dejé a la respuesta del ehird. Dado que, en general, sus respuestas son similares, también se dirige a usted. –

+0

Respuesta actualizada. Dependiendo de su situación y objetivos, puedo estar en desacuerdo con ehird. –

8

En GHC, los tipos integrales de tamaño fijo toman una palabra de máquina completa, por lo que no se ahorra espacio. Usar tipos de tamaño de palabra de máquina (es decir, Int y Word) probablemente sea más rápido que los tipos de tamaño fijo en la mayoría de los casos, pero usar un tipo integral de tamaño fijo será más rápido que realizar un envolvente explícito.

Debe elegir el tipo apropiado para el rango de valores que está utilizando. maxBound :: Word8 es 255, 255 + 1 :: Word8 es 0, y si está tratando con octetos, eso es exactamente lo que quiere. (Por ejemplo, ByteString s se define como el almacenamiento de Word8 s.)

Si sólo tiene algunos números enteros que no necesitan un número específico de bits, y los cálculos que estás haciendo no se va a desbordar, justo use Int o Word (o incluso Integer). Los tipos de tamaño fijo son menos comunes que los tipos integrales regulares porque, la mayoría de las veces, no necesita un tamaño específico.

Por lo tanto, no los use para el rendimiento; úselos si está buscando su semántica específica: tipos integrales de tamaño fijo con un comportamiento de desbordamiento definido.

+0

Como siempre usted y Daniel al rescate!) De acuerdo, generalmente 'Int' y' Word' son mejores que esos tipos pequeños, lo entiendo. Pero, ¿qué pasa con la segunda pregunta que estaba señalando? ¿Será aún más efectivo realizar todas las operaciones intrínsecas en 'Word' si sé que al final todavía tendría que subir la muestra de esos valores a' Word64', o En este caso, tiene sentido usar '' Word64' en todas partes desde el principio y así ahorrar algunos ciclos al eliminar las conversiones 'fromIntegral'. –

+1

Si pretende producir un resultado 'Word64', yo usaría' Word64' también para los cálculos intermedios. En una máquina de 64 bits, será una palabra de máquina, por lo que no debería haber problemas de rendimiento, y 'fromIntegral' será un NOP en tiempo de ejecución. – ehird

+0

¿Ahorro de espacio? Pensé que con patrones bang ahorrarían espacio en los constructores de datos. – user239558

Cuestiones relacionadas