[eigen] matrix and vector ctors & speed

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


We refactored our application to use Eigen column vectors
instead of std::vector and observed a fairly significant
slowdown.  Profiling pointed to the copy constructor for
Eigen vectors, so I'm wondering if there's something we're
missing.  Here's what I tried.

To copy a column vector

       Matrix<double,Dynamic,1> x;

there's the obvious copy constructor:

  1.   Matrix<double,Dynamic,1> y(x);

or the direct sizing + memcpy approach:

  2.   Matrix<double,Dynamic,1> y(x.size());
       std::memcpy(&y(0),&x(0),x.size() * sizeof(double));

By comparison, we can use an iterator based on the
memory used for x's values to construct a standard
vector:

  3.  std::vector<double> y(&x(0),&x(0) + x.size());

I timed each version by repeatedly calling it, and found
the times varied pretty widely:

  1. 26s
  2. 17s
  3. 14s

For Matrix<double,Dynamic,Dynamic> on the other hand, the
copy constructor and the memcpy versions took about the same
time.

Is there a faster way to copy vectors?  I'm guessing we'll have
the same issue if I were to pass in references, resize them and
then assign (like copy ctor) or memcpy.

This was using clang++ -O3 on a Macbook Pro with i7 CPU and clang
version:

  Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
  Target: x86_64-apple-darwin12.3.0

- Bob



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/