我写了我的第一个Rcpp
函数,并与sourceCpp
一起采购。这需要很长时间,但并不总是(有时几秒钟,但这是典型的):
system.time(sourceCpp('04_Rcpp_loads.cpp'))
user system elapsed
0.03 0.02 77.95
它处理大数据帧的速度非常快,只是编译速度很慢。
这是我的Rcpp
函数:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector loads(NumericVector feet, double m1, double base_ft, double base_press, double SF) {
int n = feet.size();
double calc_0 = 0;
double calc_1 = 0;
double calc_2 = 0;
double calc_3 = 0;
double calc_4 = 0;
double calc_5 = 0;
double calc_6 = 0;
double calc_7 = 0;
NumericVector load_psf(n);
for(int i = 0; i < n; ++i) {
calc_0 = pow(2 * feet[i] / base_ft, 2.0);
calc_1 = pow((pow(m1, 2.0) + calc_0) * (calc_0 + 1), 0.5);
calc_2 = pow(m1, 2.0) + calc_0;
calc_3 = 1 + calc_0;
calc_4 = pow(m1, 2.0) + 2 * calc_0 + 1;
calc_5 = (-2) * m1 * feet[i] / base_ft;
calc_6 = pow(m1, 2.0) + calc_0 + 1;
calc_7 = asin(m1 / calc_1);
load_psf[i] = 2 * base_press * SF *((calc_5 / pow(calc_6, 0.5)) * calc_4 / (calc_3 * calc_2) + calc_7) / 3.14159265;
}
return load_psf;
}
该功能在shinyapps.io
上的应用中使用。我不知道那里发生了什么,但启动应用程序需要很长时间,所以我怀疑同样的事情。上面的输出直接来自我的Windows机器上的RStudio。在此发布时,所有软件包已更新为最新版本。
我怀疑有一种方法可以使它更快-通过预编译也许?我如何使它更快?当我这样做时,我将如何在shinyapps.io
上运行它?
几点要点:
-
如果你把你的函数作为一个包的一部分,它只会离线编译一次,你可以直接加载它,这基本上是"免费的";在资源使用方面……这就是我要做的。
-
有编译选项,你现在可以选择头
Rcpp/Rcpp
,Rcpp/Light
,Rcpp/Lighter
和Rcpp/Lightest
(选择多少可选的Rcpp
功能包括在内。 -
编译是非常昂贵的。在可能的情况下,我总是尝试通过
ccache
依赖缓存编译——更多信息请参阅我的这篇博客文章。
希望这对你有帮助。很高兴讨论更多,也许在rpp -devel列表。