Haskell 与装箱数组相比,未装箱数组的效率
我在Haskell 与装箱数组相比,未装箱数组的效率,haskell,dll,Haskell,Dll,我在R、在Rcpp(一个C++库中实现了一个算法,该库允许轻松生成可从R调用的DLL),并在Haskell(可用)中实现了该算法。我在Haskell中有两个不同的实现:一个使用盒式数组,另一个使用非盒式数组(都是可变数组) 以下是算法计算的表达式: 解释这个表达式没用,这只是为了说明这是一个被截断为整数m的序列 我已经从Haskell实现中创建了一个DLL,它可以从R调用(借助inline-R库)。因此,我可以在R中比较四种实现的速度。对于较小的m,优胜者是C++。但是当我增加m时,Haske
R
、在Rcpp
(一个C++
库中实现了一个算法,该库允许轻松生成可从R
调用的DLL),并在Haskell(可用)中实现了该算法。我在Haskell中有两个不同的实现:一个使用盒式数组,另一个使用非盒式数组(都是可变数组)
以下是算法计算的表达式:
解释这个表达式没用,这只是为了说明这是一个被截断为整数m
的序列
我已经从Haskell实现中创建了一个DLL,它可以从R
调用(借助inline-R
库)。因此,我可以在R
中比较四种实现的速度。对于较小的m
,优胜者是C++
。但是当我增加m
时,Haskell胜过C++
。下面是一个基准测试示例,示例为m=40
:
> benchmarks <- function(m){
+ microbenchmark(
+ R = R(m), # R evaluation
+ Rcpp = Rcpp(m), # Rcpp (C++) evaluation
+ Haskell = Haskell(m), # Haskell evaluation
+ Haskell2 = Haskell2(m), # Haskell evaluation with unboxed arrays
+ times = 2
+ )
+ }
> benchmarks(40L)
Unit: seconds
expr min lq mean median uq max neval cld
R 100.923679 100.923679 100.948899 100.948899 100.974118 100.974118 2 d
Rcpp 27.207624 27.207624 27.252485 27.252485 27.297347 27.297347 2 c
Haskell 6.981935 6.981935 7.147086 7.147086 7.312237 7.312237 2 a
Haskell2 8.447389 8.447389 8.629766 8.629766 8.812144 8.812144 2 b
Haskell经常使用列表融合,简言之,它从不构建列表,而是以循环机制将其转换,因此避免构建
cons
等,根据具体的算法,可能会发生根本不创建列表的情况,因此,装箱/拆箱甚至不相关。@WillemVanOnsem该算法从一个填充了零的数组开始,然后使用递归逐个填充单元格。您可以看到算法。很抱歉问一个小问题,但是:不同的实现是否实际产生相同的结果(模取整错误)?@chi是的,完全相同。我还有一个Julia实现,它也给出了相同的结果:)你做了很多向量的串联吗?封闭盒向量是分配指针数组并复制旧指针的问题。未绑定向量的串联涉及到复制元素本身,这通常是一个相等的成本,但如果元素较大,成本可能会更高。Haskell经常使用列表融合,简而言之,它从不构建列表,而是将其转换为循环机制,从而避免构建cons
,等等。,根据具体的算法,可能会出现根本不制作列表的情况,因此装箱/拆箱甚至不相关。@WillemVanOnsem该算法从一个填充了零的数组开始,然后使用递归逐个填充单元格。您可以看到算法。很抱歉问一个小问题,但是:不同的实现是否实际产生相同的结果(模取整错误)?@chi是的,完全相同。我还有一个Julia实现,它也给出了相同的结果:)你做了很多向量的串联吗?封闭盒向量是分配指针数组并复制旧指针的问题。未绑定向量的串联涉及到复制元素本身,这通常是一个相同的成本,但如果它们很大,成本可能会更高。
foreign-library Hypergeom
buildable: True
type: native-shared
if os(Windows)
options: standalone
other-modules: HyperGeomR
build-depends: base >=4.7 && < 5
, hypergeomPFQ
, inline-r
hs-source-dirs: src-dll
c-sources: StartEnd.c
default-language: Haskell2010