在循环减慢Rccp-function

时间:2015-06-03 11:39:33

标签: c++ r performance rcpp

在尝试加速我的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)似乎是一个很好的近似值。

0 个答案:

没有答案