2013-03-08 35 views
2

我正在使用广告库http://hackage.haskell.org/package/ad,我正在寻找最快的遍历来传递给它的各种功能。什么是土地中最快的Traversable实例

理想情况下,它将是一个使用连续内存数组的数据结构,因此我可以将它传递给C++世界中的数值求解器。

我最好的选择是什么?

+0

我不相信,有一些都实现'Traversable'而存在的,可以直接传递到C/C++的存储阵列的任何结构。 – 2013-03-08 06:36:05

+0

是否可以创建一个GHC插件,以某种方式切换该表示,或者这太不安全,难以被认为是可行的? – 2013-03-08 15:04:21

回答

6

一个使用连续内存数组的数据结构,所以我可以将它传递给C++世界中的数值求解器。

使用的unboxed Vector type.

的“耐储藏”约束可存储的实例 - 能够被传递到C - 限制您的可用数据类型很多。矢量支持非常快bulk operations。另一种选择是Repa阵列。

但是,由于ad软件包需要Functor和Traversable,所以您将受到限制,但它们仅用于完整性 - 并且实际上序列化为列表以获得可遍历实例。可穿越和可存储不会混合,因为可存储是受限于某些未装箱类型的类。

+0

我的猜测是,如果Vector正在向列表中转换,则在某些情况下使用列表可能会更快。 – 2013-03-08 18:29:49

+0

@Jonathan Fischoff它只是一个方便的方法来向/从矢量基础设施输入/输出数据。通常高性能的矢量处理不应该处理列表。 – leventov 2013-03-08 19:07:39

+0

@leventov我同意,如果我可以选择使用适合Vector的AD包,但由于情况并非如此,所以不清楚使用Vector穿越将比使用列表更好...还是它? – 2013-03-08 19:55:10

2

instance Traversable (Data.Functor.Constant a)

(对不起!)