Есть ли способ ускорить создание MatrixXd, заполненного нулями?
Действительно, рассмотрим этот код
#include <vector>
#include <iostream>
#include <chrono>
#include <ctime>
#include <Eigen/Core>
int main() {
std::vector<void*> results;
results.reserve(2000);
int n = 200;
auto t0 = std::chrono::system_clock::now();
for(int i = 0; i < 1000; i++) {
Eigen::MatrixXd* A = new Eigen::MatrixXd(n,n);
A->setZero();
results.push_back(A);
}
auto t1 = std::chrono::system_clock::now();
for(int i = 0; i < 1000; i++) {
double* A = (double*)calloc(n * n, sizeof(double));
results.push_back(A);
}
auto t2 = std::chrono::system_clock::now();
std::chrono::duration<double> t01 = t1-t0;
std::chrono::duration<double> t12 = t2-t1;
printf("Eigen+setZero %e calloc %e size %lu\n", t01.count(), t12.count(), results.size());
}
в результате (на моем ноутбуке)
./a.out
Eigen+setZero 5.440070e-01 calloc 1.527000e-03 size 2000
Матрицы строятся с использованием Eigen :: MatrixXd (n, n), за которым следует setZero.
Если посмотреть на время более детально, setZero занимает почти все время (новый - супер быстрый). Есть ли способ ускорить это?
В идеале я хотел бы перейти к тому, что возможно с использованием просто calloc.
Memset на самом деле не помогает, он такой же медленный, как setZero.
Наконец, я хотел бы иметь MatrixXd, поэтому маршрут Map не идеален.