使用arma :: field时创建类的开销?

时间:2019-07-18 12:21:04

标签: c++ armadillo

通过传递SecondClass的实例来创建FirstClass的新类实例时,我遇到性能问题,但是仅当 FirstClass包含一个类型arma::field的成员。

这似乎与this问题有关,该问题表明使用类应该有很少的开销。只要FirstClass不包含类型arma::field的成员,我的确是对的。 arma::field有什么特别之处,还是我以某种意外的方式使用它?

这是一个最小的,可重复的示例。类FirstClass包含一个标准数组和一个arma::field,这是完全没用的(在示例中从未使用过)。它还包含一个函数CalculateStuff(),在这种情况下,该函数汇总了数组的元素。

#include <armadillo>
#include <ctime>
#include <iostream>

int main()
{
    FirstClass myFC;
    myFC.CalculateStuff(myFC);
}

class FirstClass
{
public:
    FirstClass();

    double* mArray;
//    double* mHugeAndUseless;
    arma::field<arma::Cube<double>> mHugeAndUseless;

    void CalculateStuff(FirstClass FC);
};

FirstClass::FirstClass()
{
    mArray = new double [10000];
//    mHugeAndUseless = new double [20000];
    mHugeAndUseless.set_size(20);
    for (int t=0;t<20;t++)
    {
        mHugeAndUseless(t).set_size(10,10,10);
    }
}

void FirstClass::CalculateStuff(FirstClass FC)
{
    double stuff = 0.0;
    std::clock_t begin = clock();
    for (int i=0;i<10000;i++)
    {
        // Option 1: with class
        SecondClass mySC(FC, i);
        stuff += mySC.mStuff;
        // Option 2: without class
//        stuff += mArray[i];
    }
    std::clock_t end = clock();
    double elapsed = double(end-begin) / CLOCKS_PER_SEC;
    std::cout << "Code timed at " << elapsed << " seconds\n";
}

我要么直接求和数组中的成员,要么通过传递SecondClass和当前索引作为参数来创建FirstClass的实例。 SecondClass.mStuff然后包含数组的相关元素。

class SecondClass
{
public:
    SecondClass(FirstClass FC, int i);
    double mStuff;
};

SecondClass::SecondClass(FirstClass FC, int i)
{
    mStuff = FC.mArray[i];
}

根据上面链接的问题,在使用SecondClass和直接求和之间的性能应该是可比的。但是,我发现使用25,000时,代码花费的运行时间大约是SecondClass倍。仅当FirstClass包含类型为arma::field的成员时,才会发生这种情况。用相同大小的数组替换该成员可以解决问题。

0 个答案:

没有答案