库适配器性能损失



我正在尝试包装 Eigen3 线性代数库,使其语法变得更清晰。但是,作为第一步,当我创建 + 运算符重载(通过 += 重载)时,包装器会立即遭受 3 倍的性能损失。您能否提供一些关于哪里出了问题以及如何解决的见解?谢谢。

#include <iostream>
#include <ctime>
using namespace std;
#include "EigenEigen"
class Wmat
{
    Eigen::ArrayXXd M;
public:
    Wmat& operator+=(const Wmat& rhs)
        {this->M += rhs.M; return *this;}
    const Wmat operator+(const Wmat &rhs2)
        {Wmat result = *this; result+= rhs2; return result;}
    void Random(int D1, int D2)
        {M = Eigen::ArrayXXd::Random(D1,D2);}
};
int main()
{
    int D = 1000000;
    int T=1000;
    clock_t start;
//---------------------------------------------------------------
    Eigen::ArrayXXd LHS = Eigen::ArrayXXd::Random(D,1);
    Eigen::ArrayXXd RHS1 = Eigen::ArrayXXd::Random(D,1);
    Eigen::ArrayXXd RHS2 = Eigen::ArrayXXd::Random(D,1);
    start = clock();
    for (int i=1; i<=T; ++i)
    {
        LHS = RHS1 + RHS2;
    }
    cout << (clock()-start) / (double) CLOCKS_PER_SEC << endl;
//---------------------------------------------------------------
    Wmat LHSW, RHSW1, RHSW2;
    RHSW1.Random(D,1); RHSW2.Random(D,1); LHSW.Random(D,1);
    start = clock();
    for (int i=1; i<=T; ++i)
    {
        LHSW = RHSW1 + RHSW2;
    }
    cout << (clock()-start) / (double) CLOCKS_PER_SEC << endl;
//---------------------------------------------------------------
    return 0;
}

编写包装器不适用于表达式模板。例如,您添加的任何方法都可用于Wmat a+b除非您在Wmat中明确评估它,从而失去大部分特征功能。使其与旧的矩阵/向量库兼容的正确方法是利用 Eigen 的插件机制。此机制允许直接在 Eigen 对象和表达式的类定义中添加新成员。有关详细信息,请参阅此页面。

最新更新