These smaller types give you a memory reduction only when you store them in unboxed arrays or similar. There, each will take as many bits as indicated by the type suffix.
In general use, they all take exactly as much storage as an Int
or Word
, the main difference is that the values are automatically narrowed to the appropriate bit size when using fixed-width types, and there are (still) more optimisations (in the form of rewrite rules mainly) for Int
and Word
than for Int8
etc., so some operations will be slower using those.
Concerning the question whether to use Word64
throughout or to use smaller types, that depends. On a 64-bit system, when compiling with optimisations, the performance of Word
and Word64
should mostly be the same since where it matters both should be unpacked and the work is done on the raw machine Word#
. But there probably still are a few rules for Word
that have no Word64
counterpart yet, so perhaps there is a difference after all. On a 32-bit system, most operations on Word64
are implemented via C calls, so there operations on Word64
are much slower than operations on Word
.
So depending on what is more important, simplicity of code or performance on different systems, either
- use
Word64
throughout: simple code, good performance on 64-bit systems
- use
Word
as long as your values are guaranteed to fit into 32 bits and transform to Word64
at the latest safe moment: more complicated code, but better performance on 32-bit systems.