预编译R包与本地cppFunction调用的Rcpp性能差异排查
Rcpp预编译包与动态编译代码的巨大性能差异问题
我发现预编译R包中的Rcpp代码,与本地通过cppFunction()动态编译运行的代码之间存在巨大性能差异,以下是最小可复现示例:
包结构与文件内容
运行roxygen前的包目录包含三个核心文件:
- DESCRIPTION:定义包基本信息,依赖R、Rcpp、RcppEigen等
- code.R:导出调用C++函数的R接口
eigen_det - routine.cpp:实现基于Eigen的行列式计算C++函数
eigen_det_cpp
运行roxygen后生成NAMESPACE、RcppExports.R、RcppExports.cpp文件,其中手动添加了useDynLib语句。
性能测试
安装包后通过microbenchmark进行测试:
library(microbenchmark) library(bare) p = 100 M = matrix(rnorm(p^2), nrow = p) Rcpp::cppFunction(depends = "RcppEigen", ' double eigen_det_cpp_on_the_fly(const Eigen::Map<Eigen::MatrixXd> X, int n_cores) { Eigen::setNbThreads(n_cores); return X.determinant(); } ') microbenchmark( within_package = eigen_det(M, 1), on_the_fly = eigen_det_cpp_on_the_fly(M, 1), times = 10 )
测试结果显示,包内调用耗时约为动态编译调用的30倍。
环境信息
- R版本:开发版
- 操作系统:Windows 11
- 已加载依赖包:Rcpp、RcppEigen等
疑问
该性能差异由何导致?我哪里操作有误?
内容的提问来源于stack exchange,提问作者Adam Kapelner
相关产品推荐
相关产品推荐

