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