为什么特征向量这么慢?

Why eigen vector is so slow?

我发现减去两个 Eigen::Vector3f 的计算比减去两个结构慢。

我在Eigen::Vector3f和自定义结构之间调用了10000000次减法。 我发现自定义结构的速度是Eigen::Vector3f的20倍。

这是我的测试代码。

#include<Eigen/Eigen>
#include<iostream>
#include "timer.h"

struct Point {
    float x, y, z;
    Point Add(const Point& point) const {
        Point result = {
            x + point.x,
            y + point.y,
            z + point.z
        };
        return result;
    }
};

Eigen::Vector3f sub_eigen(const Eigen::Vector3f& vector_a,
                          const Eigen::Vector3f& vector_b) {
    Eigen::Vector3f result;
    result = vector_a - vector_b;
    return result;
};

Point sub_point(const Point& point_a,
                const Point& point_b) {
    Point result = point_a.Add(point_b);
    return result;
}


int main() {
    Eigen::Vector3f source_eigen(1.f, 1.f, 1.f);
    Eigen::Vector3f dest_eigen(1.f, 1.f, 1.f);
    Point point_a = {1.f, 1.f, 1.f};
    Point point_b = {1.f, 1.f, 1.f};
    int num_tests = 10000000;
    std::cout << "Caculate time:" << num_tests << "\n";
    Timer timer;
    timer.Tic();
    for (int i = 0; i < num_tests; i++) {
        Eigen::Vector3f result_eigen =
            sub_eigen(source_eigen, dest_eigen);
    }
    timer.Toc();
    std::cout << "Time[Eigen]:" << timer.TimeElapsed() << "\n";

    timer.Tic();
    for (int i = 0; i < num_tests; i++) {
        Point result_point =
            sub_point(point_a, point_b);
    }
    timer.Toc();
    std::cout << "Time[Point]:" << timer.TimeElapsed() << "\n";

    return 0;
}

结果如下:

Caculate time:10000000
Time[Eigen]:3.3389
Time[Point]:0.163778

可以看到Eigen::Vector3f的速度比自定义结构慢了将近20倍
我使用 eigen 的方式不对吗?

Eigen 对优化非常敏感,例如在我的系统上 -O0:

Caculate time:10000000
Time[Eigen]:6.80348
Time[Point]:0.275657

但是 -O3:

Caculate time:10000000
Time[Eigen]:0.0128227
Time[Point]:0.0116121