为什么特征向量这么慢?
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
我发现减去两个 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