为什么要使用第三方矢量库
Why use third-party vector libraries at all?
所以我正在考虑将特征矩阵库用于我正在进行的项目(2D空间模拟器)。我只是继续介绍了一些使用Eigen::Vector2d和裸数组的代码。我注意到在为数组中的元素赋值方面提高了10倍,在计算点积方面提高了40倍。
如果你想看看的话,这是我的评测,基本上是4.065秒对0.110秒。
显然,裸阵列在点积和分配东西方面要高效得多。那么,为什么要使用Eigen库(或者任何其他库,Eigen似乎是最快的)呢?它稳定吗?复杂的数学很难自己有效地编码?
这些库的真正优势是内置SIMD矢量化。
看起来默认情况下,eigen不会启用它,您需要使用define/compiler开关来启用它。(编辑:错误阅读链接,如果它检测到编译器支持它,它就会被启用,并且你需要在一些编译器上启用指令,但在你的编译器上,默认情况下可能会打开,也可能不会打开)
- 更好的可移植性。单个开发人员可能没有考虑(或可能无法访问)多个平台
- 可靠性更好。(正如唐尼提到的)图书馆通常要经过更彻底的测试
- 更好的开发人员流动性。如果其他人使用标准库组件,那么处理他们的代码会更容易
- 避免重新发明轮子。您希望避免出现每个开发人员以自己的方式开发相同组件的情况
- 自定义实现可能很快就会过时。在有限的时间内,您可以不断更新和支持您的库版本。标准库可能会有更多的支持工作
- 更好的"外部"支持。以C++STL库为例。你会从那些不是最初开发者的人那里找到大量的资源。此外,教科书将涵盖标准库组件,这有助于新用户和学生在不给开发人员带来任何负担的情况下学习这些组件
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
案例中的编译器进行了一些针对基准测试特性的优化。你可能想调查一下。
我认为这消除了你不使用库的一点:速度。一旦这些标准被排除在外,我就没有理由不使用现有的图书馆,除了你想为学术目的做点什么,或者你想写自己的图书馆。这些天,每当我看到一个库或其他代码实现了自己的矩阵和向量类时,如果可能的话,我都会尽量避免它。有了Eigen,我甚至对Matlab的需求更低。。。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么无法覆盖涉及第三方代码的模板类的运算符<<?
- 为什么要使用第三方矢量库
- 当第三方代码中没有警告时,为什么不将所有警告视为错误?
- 如果我们有很多库的源代码,为什么我们要尝试链接第三方库呢?