在尝试加速我的Rcpp代码时,我发现了一些我无法解释的奇怪行为。
考虑功能
#include <Rcpp.h>
// [[Rcpp::export]]
int TestRandC(int n) {
Rcpp::NumericVector vec(1000);
for(int i = 0; i < 1000; i++){
vec[i] = (double)i/1000;
}
int count = 0;
for(int i = 0; i < n; i++){
double testvalue = 1.1;
for(int j = 0; j < 1000; j++){
while(testvalue < vec[j]){
testvalue += R::runif(0,1);
count++;
}
}
}
return count;
}
和
#include <Rcpp.h>
// [[Rcpp::export]]
int TestRandC2(int n) {
Rcpp::NumericVector vec(1000);
for(int i = 0; i < 1000; i++){
vec[i] = (double)i/1000;
}
int count = 0;
for(int i = 0; i < n; i++){
double testvalue = 1.1;
for(int j = 0; j < 1000; j++){
while(testvalue < vec[j]){
//testvalue += R::runif(0,1);
count++;
}
}
}
return count;
}
这两个函数之间的唯一区别是while循环中的第一行被注释掉了。由于while循环从未执行(vec中的所有值都是&lt; 1,而testvalue是> 1),我希望这两个函数的性能是相同的。但情况并非如此;在我的计算机上运行TestRandC(1e7)大约需要26秒,运行TestRandC2(1e7)大约需要11秒。两个函数都返回0,正如您所期望的那样。
此外,删除矢量vec并替换
while(testvalue < vec[j])
与
while(testvalue < (double)j/1000)
使两个函数的执行速度都相同(在我的计算机上为90秒)。
任何人都可以解释这里发生了什么吗?我们可以让TestRandC像TestRandC2一样快速运行吗? (或更快......?)
PS在我的脚本中,while循环当然会被执行,但只是零星的;给testvalue一个初始值R :: runif(0,1)似乎是一个很好的近似值。