我在代码里使用了 Eigen,发现程序很慢,于是我用性能分析器分析,eigen竟然耗时一半有余。。。
而且最耗时的是Eigen::Vector3d
对象的创建
/ 销毁
/ normalize()
/ 赋值
等最最基本的操作,我感觉眼睛有点发黑。
于是赶紧上网查这是怎么回事,网上给出解释,Eigen做了很多检查,在release模式的时候,就不检查了。舒了一大口气。
网友同时指出,使用宏 EIGEN_NO_DEBUG
或NDEBUG
,可以避免这些检查。
于是我就试了下。先上代码,再看测试效果。
#include <Eigen/Dense>
#include <iostream>
#include <omp.h>
void testEigenNorm(){
Eigen::Vector3d v(1, 1, 1);
for (int i = 0; i < 10000; ++i)
v.normalize();
}
void testArrayNorm(){
double nums[3] = {1,1,1};
double len = 0;
for (int i = 0; i < 10000; ++i) {
len = sqrt(nums[0] * nums[0] + nums[1] * nums[1] + nums[2] * nums[2]);
for (int j = 0; j < 3; ++j)
nums[j] /= len;
}
}
int main(){
double t1 = omp_get_wtime();
testEigenNorm();
double t2 = omp_get_wtime();
printf("eigen normalize time : %lf\n", t2-t1);
t1 = omp_get_wtime();
testArrayNorm();
t2 = omp_get_wtime();
printf("array normalize time : %lf\n", t2-t1);
system("pause");
return 0;
}
测试结果:
debug
eigen normalize time : 0.030172
array normalize time : 0.000202
debug + EIGEN_NO_DEBUG
eigen normalize time : 0.038975
array normalize time : 0.000215
debug + NDEBUG
eigen normalize time : 0.019855
array normalize time : 0.000220
release
eigen normalize time : 0.000130
array normalize time : 0.000132
经过实验
release模式下,eigen性能有保证,而且eigen内部做了大量矩阵的优化处理。可以放心使用。
宏EIGEN_NO_DEBUG
和NDEBUG
,没什么大用。