首页 > 解决方案 > 与盒装数组相比,未盒装数组的效率

问题描述

我已经实现了一个算法R,在Rcpp(一个C++允许轻松生成可从 DLL 调用的库R)和 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  

有人说未装箱的数组比装箱的数组更有效。但是,如您所见,这里不是这种情况。

这是什么原因?是否有打开 GHC 选项以从未装箱阵列的效率中受益?我正在使用文件中的默认设置制作我的foreign-libraryDLL cabal

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

标签: haskelldll

解决方案


推荐阅读