haskell - 与盒装数组相比,未盒装数组的效率
问题描述
我已经实现了一个算法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-library
DLL 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
解决方案
推荐阅读
- node.js - 在 Vs 代码上运行时如何提高 node.js 服务器的编译速度?
- reactjs - reactJs项目如何直接访问路由
- api - 确保控制器在 web api 中有一个参数少的公共构造函数没有默认构造函数
- node.js - 尝试运行开发服务器时出错 | 反应,SSR
- python - Python win32com 获取 COM 对象的 TypeName 或 Class
- angular - 如何以角度在父组件和子组件之间进行通信
- android - 如何获取应用内购买的订阅的当前状态,即购买
- javascript - 自动关闭弹出窗口
- sockets - 什么情况下bpf_get_socket_cookie()返回0
- lua - 罗技 Lua 脚本