我在代碼裏使用了 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
,沒什麼大用。