[Rcpp-devel] How to increase the coding efficiency
xian at unm.edu
Wed Dec 5 10:07:42 CET 2012
Can you post a minimal full example?
On Tue, Dec 4, 2012 at 8:39 PM, Honglang Wang
<wanghonglang2008 at gmail.com> wrote:
> Yes, the main issue for my coding is the allocation of memory. And I have
> fixed one of the biggest memory allocation issue: 4000 by 4000 diagonal
> matrix. And since I am not familiar with Rcpp and RcppArmadillo, I have no
> idea how to reuse the memory. I hope I can have some materials to learn
> this. Thanks.
>> What exactly do these timings show? A single call you your function?
>> How many calls?
> Here I called my function for 100 times.
>> Building on Romain's point: -- a portion of your function's runtime is
>> in memory allocation
>> (and you have a lot of allocations here).
>> If you're calling your function thousands or millions of times, then
>> it might pay to closely
>> examine your memory allocation strategies and figure out what's
>> temporary, for example.
>> It looks like you're already using copy_aux_mem = false in a number
>> of places, but you're
>> allocating a lot of objects -- of approx what size?
>> For example, wouldn't this work just as well with one less allocation?
>> arma::vec kk = t;
>> arma::uvec q1 = arma::find(arma::abs(tp)<h);
>> kk.elem(q1) = ((1-arma::pow(tp.elem(q1)/h,2))/h)*0.75;
>> // done with q1. let's reuse it.
>> q1 = arma::find(arma::abs(tp)>=h);
>> // was q2
>> You could potentially allocate memory for temporary working space in
>> R, grab it with copy_aux_mem = false, write your temp results there,
>> and reuse these objects in subsequent function calls. It doesn't make
>> sense to go to this trouble, though, if your core algorithm consumes
>> the bulk of runtime.
>> Have you looked on the armadillo notes r.e. inv? Matrix inversion has
>> O(>n^2). You may be aided by pencil-and-paper math here.
> Here my matrix for inverse is only 4 by 4, so I think it's ok.
>> > Dear All,
>> > I have tried out the first example by using RcppArmadillo, but I am not
>> > sure whether the code is efficient or not. And I did the comparison of
>> > the
>> > computation time.
>> > 1) R code using for loop in R: 87.22s
>> > 2) R code using apply: 77.86s
>> > 3) RcppArmadillo by using for loop in C++: 53.102s
>> > 4) RcppArmadillo together with apply in R: 47.310s
>> > It is kind of not so big increase. I am wondering whether I used an
>> > inefficient way for the C++ coding:
>> A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
More information about the Rcpp-devel