通过传递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
的成员时,才会发生这种情况。用相同大小的数组替换该成员可以解决问题。