【问题标题】:Differences between Storable and Unboxed Vectors可存储向量和未装箱向量之间的差异
【发布时间】:2016-10-21 12:26:31
【问题描述】:

所以...我现在最好使用未装箱的向量(来自vector 包),而没有给予太多考虑。 vector-th-unbox 让为它们创建实例变得轻而易举,何乐而不为。

现在我遇到了一个实例,我无法自动派生这些实例,这是一种带有幻像类型参数的数据类型(如Vector (s :: Nat) a,其中s 对长度进行编码)。

这让我想到了StorableUnboxed 向量之间的区别。我自己想出来的事情:

  • Unboxed 会将元组存储为单独的向量,从而在只需要其中一个值时不会浪费带宽,从而实现更好的缓存局部性。
  • Storable 仍将被编译为简单的(并且可能是高效的)readArray#s,它返回未装箱的值(通过阅读核心很明显)。
  • Storable 允许直接指针访问,这允许与外部代码的互操作性。 Unboxed 没有。
  • [编辑] Storable 实例实际上比Unbox(即VectorMVector)更容易手写。

仅此一点并不能让我明白为什么Unboxed 甚至存在,它似乎没有什么好处。可能我在那里遗漏了什么?

【问题讨论】:

  • 我发誓我曾在某处对此大喊大叫,但我再也找不到它了 :( 我不知道 UnboxedStorable 向量之间的任何性能差异。您可能会发现 this answer 有帮助,以及我对 OP 的评论。
  • 嗯......“每个人都想在不知道为什么的情况下拆箱”评论似乎很合适。
  • 哈哈,它里面!我想我对这个问题的答案很感兴趣,因为它基本上也是在我的(链接的)答案中提出的。
  • Storable 向量只是 ForeignPtrs,所以它具有所有相同的属性:运行终结器,不能被 GC 移动等。此外,Storable 实例应该布置数组以一种应该被 C 识别为数组的方式键入(即连续的、正确的对齐方式) - 但是,Unbox 允许您编写自定义实例来做任何您想做的事情!例如您可能会比其他元素更频繁地阅读每个 kth 元素,因此您可能决定将这些元素存储在一个连续的块中,或者如您所提到的,单独存储元组以减少缓存未命中。
  • .. 我认为该文档非常清楚地说明了为什么存在 Unbox:“Data.Vector.Unboxed:具有基于数据类型系列的自适应表示的未装箱向量。”

标签: haskell haskell-vector


【解决方案1】:

抄自https://haskell-lang.org/library/vector

可存储和未装箱的向量都将它们的数据存储在一个字节数组中,避免 指针间接。这更节省内存并允许更好地使用 缓存。可存储向量和未装箱向量之间的区别很微妙:

  • 可存储向量需要作为Storable type class 实例的数据。 此数据存储在malloced 内存中,该内存是pinned(垃圾 收集器无法移动它)。这可能会导致内存碎片,但是 允许通过 C FFI 共享数据。
  • 未装箱的向量需要作为Prim type class 实例的数据。 此数据存储在 GC 管理的 unpinned 内存中,这有助于避免内存 碎片化。但是,这些数据不能通过 C FFI 共享。

StorablePrim 类型类都提供了一种将值存储为的方法 字节,并将字节加载到一个值中。区别是什么类型 使用了字节数组。

像往常一样,唯一真正衡量性能的标准是基准测试。然而, 作为一般准则:

  • 如果您不需要将值传递给 C FFI,并且您有一个 Prim 实例, 使用未装箱的向量。
  • 如果您有 Storable 实例,请使用可存储向量。
  • 否则,请使用加框向量。

还有其他问题需要考虑,例如盒装向量 是Functor 的实例,而可存储和未装箱的向量则不是。

【讨论】:

  • 嗯...不知道haskell-lang 页面上有教程。也许应该将这样的段落添加到矢量文档中。
  • 可以给他们发个 PR 吗?来自对更有可能被合并的库感到困惑的用户。
【解决方案2】:

另一个区别是内存开销:

根据我的测量结果:

  • Data.Vector.Storable.Vector Int 有 64 字节开销
  • Data.Vector.Unboxed.Vector Int 有 48 字节开销。

来源:

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2015-10-12
    • 2017-09-29
    相关资源
    最近更新 更多