haskellhaskell-vector

Differences between Storable and Unboxed Vectors


So ... I've used unboxed vectors (from the vector package) preferably now without giving it much consideration. vector-th-unbox makes creating instances for them a breeze, so why not.

Now I ran into an instance where it is not possible for me to automatically derive those instances, a data type with phantom type parameters (as in Vector (s :: Nat) a, where s encodes the length).

This made me think about the differences between Storable and Unboxed vectors. Things I figured out on my own:

That alone doesn't make it evident to me why Unboxed even exists, there seem to be little benefit to it. Probably I am missing something there?


Solution

  • Cribbed from https://haskell-lang.org/library/vector

    Storable and unboxed vectors both store their data in a byte array, avoiding pointer indirection. This is more memory efficient and allows better usage of caches. The distinction between storable and unboxed vectors is subtle:

    Both the Storable and Prim typeclasses provide a way to store a value as bytes, and to load bytes into a value. The distinction is what type of bytearray is used.

    As usual, the only true measure of performance will be benchmarking. However, as a general guideline:

    There are also other issues to consider, such as the fact that boxed vectors are instances of Functor while storable and unboxed vectors are not.