Performance improvements to BlockSparseMatrix Re-allocations only happen if the already allocated buffer is not large enough. Change-Id: I5ff170a400e32a0ad64ee7c2e8ab59216db1e51b
diff --git a/internal/ceres/block_sparse_matrix.cc b/internal/ceres/block_sparse_matrix.cc index 9195e9e..214daef 100644 --- a/internal/ceres/block_sparse_matrix.cc +++ b/internal/ceres/block_sparse_matrix.cc
@@ -81,6 +81,7 @@ VLOG(2) << "Allocating values array with " << num_nonzeros_ * sizeof(double) << " bytes."; // NOLINT values_.reset(new double[num_nonzeros_]); + max_num_nonzeros_ = num_nonzeros_; CHECK_NOTNULL(values_.get()); } @@ -299,9 +300,12 @@ } } - double* new_values = new double[num_nonzeros_]; - std::copy(values_.get(), values_.get() + old_num_nonzeros, new_values); - values_.reset(new_values); + if (num_nonzeros_ > max_num_nonzeros_) { + double* new_values = new double[num_nonzeros_]; + std::copy(values_.get(), values_.get() + old_num_nonzeros, new_values); + values_.reset(new_values); + max_num_nonzeros_ = num_nonzeros_; + } std::copy(m.values(), m.values() + m.num_nonzeros(),
diff --git a/internal/ceres/block_sparse_matrix.h b/internal/ceres/block_sparse_matrix.h index 1b91a75..17491bf 100644 --- a/internal/ceres/block_sparse_matrix.h +++ b/internal/ceres/block_sparse_matrix.h
@@ -131,6 +131,7 @@ int num_rows_; int num_cols_; int num_nonzeros_; + int max_num_nonzeros_; scoped_array<double> values_; scoped_ptr<CompressedRowBlockStructure> block_structure_; CERES_DISALLOW_COPY_AND_ASSIGN(BlockSparseMatrix);