You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:17:05