Skip to content
Prev 10252 / 10988 Next

[Rcpp-devel] trying to insert a number as first element of already existing vector

Just to close this thread out, I did a more comprehensive benchmark using 8
different approaches
and it looks like

A) Jan's solution using memcopy and NumericVector.

B) A push_front solution using  NumericVector

C) Serguei's const trick solution using NumericVector

are the top 3 solutions in terms of speed with  B) push_front technically
the winner !!!!!
Thanks to everyone for their help. I learned much.

#======================================================================

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
std::vector<double> mybar(const std::vector<double>& x, double firstelem) {
   std::vector<double> tmp(x.size() + 1);
   tmp[0] = firstelem;
   for (int i = 1; i < (x.size()+1); i++)
     tmp[i] = x[i-1];
   return tmp;
}
// [[Rcpp::export]]
std::vector<double> mybar2(const std::vector<double>& x, double firstelem) {
   std::vector<double> tmp(x.size() + 1);
   tmp[0] = firstelem;
   std::copy(x.begin(), x.end(), tmp.begin()+1);
   return tmp;
}

// [[Rcpp::export]]
NumericVector mybar3(NumericVector x, double firstelem) {
   NumericVector tmp(x.size() + 1);
   tmp[0] = firstelem;
   std::copy(x.begin(), x.end(), tmp.begin()+1);
   return tmp;
}

// [[Rcpp::export]]
NumericVector mybar4(NumericVector x, double firstelem) {
   NumericVector result(x.size() + 1);
   result[0] = firstelem;
   std::memcpy(result.begin()+1, x.begin(), x.size()*sizeof(double));
   return result;
}

// [[Rcpp::export]]
NumericVector mybar5(NumericVector x, NumericVector y) {
   NumericVector result(x.size() + y.size());
   std::memcpy(result.begin(), x.begin(), x.size()*sizeof(double));
   std::memcpy(result.begin()+x.size(), y.begin(), y.size()*sizeof(double));
   return result;
}

// [[Rcpp::export]]
NumericVector mybar6(NumericVector x, double firstelem) {
  x.insert(0, firstelem);
  return x;
}

// [[Rcpp::export]]
NumericVector mybar7(NumericVector x, double firstelem) {
  x.push_front(firstelem);
  return x;
}

// [[Rcpp::export]]
NumericVector mybar8(const NumericVector &x, const NumericVector &y) {
    NumericVector result(x.size() + y.size());
    std::memcpy(result.begin(), x.begin(), x.size()*sizeof(double));
    std::memcpy(result.begin()+x.size(), y.begin(),
    y.size()*sizeof(double));
    return result;
}


/*** R

library(microbenchmark)

 n=1E7
 testvec = c(1,seq_len(n))
 testelem <- 7
 microbenchmark(c(testelem, testvec), mybar(testvec,testelem),
 mybar2(testvec,testelem),
 mybar3(testvec,testelem),
 mybar4(testvec,testelem),
 mybar5(testvec,testelem),
 mybar6(testvec,testelem),
 mybar7(testvec,testelem),
 mybar8(testvec,testelem)
 )


 */

microbenchmark(c(testelem, testvec), mybar(testvec,testelem),
+  mybar2(testvec,testelem),
+  mybar3(testvec,testelem),
+  mybar4(testvec,testelem) .... [TRUNCATED]
Unit: milliseconds
                      expr      min        lq      mean    median
uq       max neval
      c(testelem, testvec) 33.82390  37.41429  42.70048  42.48487
47.72840  81.53239   100
  mybar(testvec, testelem) 93.35373 100.67106 105.30134 105.67559 109.62234
125.15337   100
 mybar2(testvec, testelem) 88.00770  94.62231  98.84161  98.51031 102.49516
114.58349   100
 mybar3(testvec, testelem) 27.93793  31.94207  36.76242  37.17255
41.52102  47.31534   100
 mybar4(testvec, testelem) 31.37486  34.73718  39.72786  40.83917
44.21151  49.48883   100
 mybar5(testvec, testelem) 30.90608  35.25496  40.24085  40.59592
44.88581  50.33709   100
 mybar6(testvec, testelem) 33.24435  38.32075  43.11721  43.46578
47.93726  52.72538   100
 mybar7(testvec, testelem) 30.80926  33.41609  38.45877  37.71916
43.70371  48.88513   100
 mybar8(testvec, testelem) 30.88067  35.01826  40.38411  40.02501
44.49641  73.84147   100
On Mon, Dec 10, 2018 at 8:42 AM Serguei Sokol <serguei.sokol at gmail.com>
wrote:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20181211/ea34d3f0/attachment-0001.html>