Thank you for providing a point of reference with regards to speed. Dirk's examples have ratios of 60:1 causing me to rethink my approach.<br><br><div class="gmail_quote">On Thu, Dec 20, 2012 at 1:18 PM, H Xiong <span dir="ltr"><<a href="mailto:haoxiong.ucsf@gmail.com" target="_blank">haoxiong.ucsf@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Alon,<div><br></div><div>I am only a user, not a developer, of Rcpp, so I will offer some observations only.<br><br>
<div class="gmail_quote"><div class="im">On Thu, Dec 20, 2012 at 9:35 AM, Alon Honig <span dir="ltr"><<a href="mailto:honeyoak@gmail.com" target="_blank">honeyoak@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">My current RCPP program is only 4 times faster than its R byte code compiled equivalent. I am trying to speed up my code and from what I understand using pointers prevents an external function from copying the entire object when executing its methods.   I am having difficulty finding salient examples that use points and NumericVectors. Please tell me how in this same code I could get the functions "get_sum" and "get_var" to point to the NumericVector object "v" rather than copy the whole thing.<br>

</blockquote><div><br></div></div><div>Many of R commands have C or Fortran implementation so it is not always the case that Rcpp program will be many times faster. I once translated an R loop into C and I roughly doubled the speed, so 4 times speedup isn't bad. Your examples are very simple functions that R  has built-in commands for and it is unlikely you can surpass R implementation in overall robustness and numeric stability.</div>

<div><br></div><div>I don't recommend messing with raw pointers. Even if you are familiar with C interface of R's garbage collector, it is better to let Rcpp take care of the low level details for you. You can use constant reference to pass objects around and there is no copy involved (see below). You just need to be careful that objects are held by some variables and not garbage collected by R's garbage collector. </div>
<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br><blockquote style="margin:0 0 0 40px;border:none;padding:0px">library(inline)<br>library(Rcpp)<br> a=1:1000000<br>Rcpp.var = cxxfunction(signature(input="numeric"), plugin="Rcpp",<br>body="</blockquote>


<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"> NumericVector v = input; </blockquote></blockquote></blockquote></div><div>Here there is no copy, because the constructor for NumericVector taking SEXP knows how to  use pointers. Note that this no-copy behavior only applies when SEXP is holding an object of the same type as the constructor's type.</div>
<div class="im">
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


 int n = v.size();</blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"> double v_mean =  get_sum(v,n)/n;</blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"> double v_var = get_var(v,v_mean,n);</blockquote>


<blockquote style="margin:0 0 0 40px;border:none;padding:0px"> return wrap(v_var);<br><br></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">",includes="<br><br></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<div> double get_var(NumericVector v,double m,int l)</div></blockquote></blockquote></blockquote></div><div>double get_var(const NumericVector& v, double m, int l) </div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> {double a = 0;</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<div>     for (int i = 0; i <l;i++)</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>{a += (v[i]-m)*(v[i]-m);}</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<div>return(a/l);</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> }</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<div> double get_sum(NumericVector v,int l)</div></blockquote></blockquote></blockquote></div><div>double get_sum(const NumericVector& v, int l) </div><div><br></div><div>Hao</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">
<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> { double s = 0;</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<div>   for (int i = 0; i <l;i++)</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>{s += v[i];}</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>

return(s);</div>
</blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> }</div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> ")</div><div><br></div><div> b=system.time(for (i in 1:100)Rcpp.var (a))</div>


<div> c= system.time(for (i in 1:100)var (a))</div></blockquote><div><br><br>Thank you Alon.</div><div><br></div><div>P.S. I am aware that the "get_var" function provides the population variance and not the sample variance.</div>


<div><br></div>
<br></div>_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br></blockquote></div><br></div>
</blockquote></div><br>