有没有一种方法可以加快创建零的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路线并不理想。