所以我正在考虑将Eigen矩阵库用于我正在做的项目(2D空间模拟器)。我只是继续使用Eigen :: Vector2d和裸阵列来描述一些代码。我注意到为数组中的元素赋值有10倍的改进,并且在计算点积时提高了40倍。
如果你想查看它,这里是my profiling,基本上它是~4.065s对抗~0.110s。
显然裸阵列在点积和分配东西方面效率更高。那么为什么要使用Eigen库(或任何其他库,Eigen看起来最快)?它稳定吗?难以自己编码的复杂数学?
答案 0 :(得分:3)
这些图书馆真正的胜利是内置的SIMD矢量化。
默认情况下,eigen看起来没有启用,你需要enable it使用define / compiler开关。 (编辑:误读链接,如果它检测到编译器支持它,则启用它,并且您需要启用某些编译器上的指令,默认情况下,可能在编译器上启用,也可能不启用)
(更不用说它们通常比家用滚动解决方案经过更彻底的测试,并且能够实现各种复杂/有趣的东西,这些都是真正的手工编写代码)
答案 1 :(得分:1)
选择标准库代码有很多原因。
答案 2 :(得分:1)
我刚看了一下您的基准测试并得到以下结果:
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的需求甚至更低......