diff options
author | Gael Guennebaud <g.gael@free.fr> | 2010-05-17 16:54:17 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2010-05-17 16:54:17 +0200 |
commit | cf6d3162cce31f608a9e2a3d7a722334fd8f7695 (patch) | |
tree | 90873ce0a36d5aea6708b365c0b3d1f139c12702 /Eigen | |
parent | 0f3bcf853f3bed0f85079b77b4e92905b2ad0305 (diff) |
cache outer size in Block => x1.5 speed up for a.block() = b.block()
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/Block.h | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Eigen/src/Core/Block.h b/Eigen/src/Core/Block.h index 6f338d020..dd07142c6 100644 --- a/Eigen/src/Core/Block.h +++ b/Eigen/src/Core/Block.h @@ -253,6 +253,7 @@ class Block<XprType,BlockRows,BlockCols,true> ei_assert( (i>=0) && ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows()) ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols()))); + init(); } /** Fixed-size constructor @@ -262,6 +263,7 @@ class Block<XprType,BlockRows,BlockCols,true> { ei_assert(startRow >= 0 && BlockRows >= 1 && startRow + BlockRows <= xpr.rows() && startCol >= 0 && BlockCols >= 1 && startCol + BlockCols <= xpr.cols()); + init(); } /** Dynamic-size constructor @@ -276,6 +278,7 @@ class Block<XprType,BlockRows,BlockCols,true> && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols)); ei_assert(startRow >= 0 && blockRows >= 0 && startRow + blockRows <= xpr.rows() && startCol >= 0 && blockCols >= 0 && startCol + blockCols <= xpr.cols()); + init(); } /** \sa MapBase::innerStride() */ @@ -289,9 +292,7 @@ class Block<XprType,BlockRows,BlockCols,true> /** \sa MapBase::outerStride() */ inline int outerStride() const { - return ei_traits<Block>::HasSameStorageOrderAsXprType - ? m_xpr.outerStride() - : m_xpr.innerStride(); + return m_outerStride; } #ifndef __SUNPRO_CC @@ -304,11 +305,21 @@ class Block<XprType,BlockRows,BlockCols,true> /** \internal used by allowAligned() */ inline Block(const XprType& xpr, const Scalar* data, int blockRows, int blockCols) : Base(data, blockRows, blockCols), m_xpr(xpr) - {} + { + init(); + } #endif protected: + void init() + { + m_outerStride = ei_traits<Block>::HasSameStorageOrderAsXprType + ? m_xpr.outerStride() + : m_xpr.innerStride(); + } + const typename XprType::Nested m_xpr; + int m_outerStride; }; /** \returns a dynamic-size expression of a block in *this. |