【发布时间】:2016-10-21 12:26:31
【问题描述】:
所以...我现在最好使用未装箱的向量(来自vector 包),而没有给予太多考虑。 vector-th-unbox 让为它们创建实例变得轻而易举,何乐而不为。
现在我遇到了一个实例,我无法自动派生这些实例,这是一种带有幻像类型参数的数据类型(如Vector (s :: Nat) a,其中s 对长度进行编码)。
这让我想到了Storable 和Unboxed 向量之间的区别。我自己想出来的事情:
-
Unboxed会将元组存储为单独的向量,从而在只需要其中一个值时不会浪费带宽,从而实现更好的缓存局部性。 -
Storable仍将被编译为简单的(并且可能是高效的)readArray#s,它返回未装箱的值(通过阅读核心很明显)。 -
Storable允许直接指针访问,这允许与外部代码的互操作性。Unboxed没有。 - [编辑]
Storable实例实际上比Unbox(即Vector和MVector)更容易手写。
仅此一点并不能让我明白为什么Unboxed 甚至存在,它似乎没有什么好处。可能我在那里遗漏了什么?
【问题讨论】:
-
我发誓我曾在某处对此大喊大叫,但我再也找不到它了 :( 我不知道
Unboxed和Storable向量之间的任何性能差异。您可能会发现 this answer 有帮助,以及我对 OP 的评论。 -
嗯......“每个人都想在不知道为什么的情况下拆箱”评论似乎很合适。
-
哈哈,它在里面!我想我对这个问题的答案很感兴趣,因为它基本上也是在我的(链接的)答案中提出的。
-
Storable向量只是ForeignPtrs,所以它具有所有相同的属性:运行终结器,不能被 GC 移动等。此外,Storable实例应该布置数组以一种应该被 C 识别为数组的方式键入(即连续的、正确的对齐方式) - 但是,Unbox允许您编写自定义实例来做任何您想做的事情!例如您可能会比其他元素更频繁地阅读每个kth 元素,因此您可能决定将这些元素存储在一个连续的块中,或者如您所提到的,单独存储元组以减少缓存未命中。 -
.. 我认为该文档非常清楚地说明了为什么存在
Unbox:“Data.Vector.Unboxed:具有基于数据类型系列的自适应表示的未装箱向量。”