所以我正在考虑将 Eigen 矩阵库用于我正在做的项目(2D 空间模拟器)。我只是继续使用 Eigen::Vector2d 和裸数组分析了一些代码。我注意到在为数组中的元素赋值方面提高了 10 倍,在计算点积方面提高了 40 倍。
如果您想查看它,这是我的分析,基本上它是 ~4.065s 对 ~0.110s。
显然,裸数组在点积和分配内容方面效率更高。那么为什么要使用 Eigen 库(或任何其他库,Eigen 似乎是最快的)?是稳定性吗?自己难以高效编码的复杂数学?
所以我正在考虑将 Eigen 矩阵库用于我正在做的项目(2D 空间模拟器)。我只是继续使用 Eigen::Vector2d 和裸数组分析了一些代码。我注意到在为数组中的元素赋值方面提高了 10 倍,在计算点积方面提高了 40 倍。
如果您想查看它,这是我的分析,基本上它是 ~4.065s 对 ~0.110s。
显然,裸数组在点积和分配内容方面效率更高。那么为什么要使用 Eigen 库(或任何其他库,Eigen 似乎是最快的)?是稳定性吗?自己难以高效编码的复杂数学?
这些库的真正胜利是内置的 SIMD 矢量化。
看起来 eigen 默认情况下不启用它,您需要使用定义/编译器开关启用它。(编辑:误读链接,如果它检测到编译器支持它,它就会启用,并且您需要在某些编译器上启用指令,仍然,可能会或可能不会在您的编译器上默认启用)
(更不用说它们通常比家庭推出的解决方案经过更彻底的测试,并且可以实现各种复杂/有趣的东西,这些东西真的很难手工编码)
选择标准库代码的原因有很多。
PS/免责声明:抱歉,我不知道 Eigen 库。以上几点是从关于标准库的更一般的角度来看的。
我刚刚查看了您的基准测试并得到以下结果:
g++ -I/usr/include/eigen3/ eigen.cpp -o eigen
g++ -O3 -I/usr/include/eigen3/ eigen.cpp -o eigen_opt
g++ -I/usr/include/eigen3/ matrix.cpp -o matrix
g++ -O3 -I/usr/include/eigen3/ matrix.cpp -o matrix_opt
./eigen 3.10s user 0.00s system 99% cpu 3.112 total
./eigen_opt 0.00s user 0.00s system 0% cpu 0.001 total
./matrix 0.06s user 0.00s system 96% cpu 0.058 total
./matrix_opt 0.00s user 0.00s system 0% cpu 0.001 total
除非您打开编译器优化,否则 Eigen 确实不快。我还怀疑该-O3
案例中的编译器做了一些不利于基准测试的优化。你可能想调查一下。
我认为这消除了您不使用库的要点之一:速度。一旦该标准被排除在外,我就没有理由不使用现有的图书馆,除非你想为学术目的做点什么,或者你想编写自己的图书馆。这些天,每当我看到实现自己的 Matrix 和 Vector 类的库或其他代码时,我都会尽可能避免使用它。有了Eigen,我什至对Matlab的需求要低得多......