本征:MatrixXd + setZero与calloc

时间:2019-05-28 18:33:48

标签: c++ eigen

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

0 个答案:

没有答案