我正在尝试包装 Eigen3 线性代数库,使其语法变得更清晰。然而,作为第一步,当我创建 + 运算符重载(通过 += 重载)时,包装器立即遭受 3 倍的性能损失。您能否提供一些有关问题出在哪里以及如何解决的见解?谢谢。
#include <iostream>
#include <ctime>
using namespace std;
#include "Eigen\Eigen"
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;
}