性能:类的向量或包含向量的类

a-d*_*dai 2 c++ arrays performance stl

我有一个包含许多double值的类.这存储在向量中,其中类的索引很重要(它们从其他地方引用).该类看起来像这样:

矢量的类

class A
{
  double count;
  double val;
  double sumA;
  double sumB;

  vector<double> sumVectorC;
  vector<double> sumVectorD;
}

vector<A> classes(10000);
Run Code Online (Sandbox Code Playgroud)

需要尽可能快地运行的代码是这样的:

vector<double> result(classes.size());
for(int i = 0; i < classes.size(); i++)
{
  result[i] += classes[i].sumA;
  vector<double>::iterator it = find(classes[i].sumVectorC.begin(), classes[i].sumVectorC.end(), testval);
  if(it != classes[i].sumVectorC.end())
    result[i] += *it;
}
Run Code Online (Sandbox Code Playgroud)

替代方案是代替一个巨大的循环,将计算分成两个独立的循环,例如:

for(int i = 0; i < classes.size(); i++)
{
  result[i] += classes[i].sumA;
}
for(int i = 0; i < classes.size(); i++)
{
 vector<double>::iterator it = find(classes[i].sumVectorC.begin(), classes[i].sumVectorC.end(), testval);
  if(it != classes[i].sumVectorC.end())
    result[i] += *it;
}
Run Code Online (Sandbox Code Playgroud)

或者将类的每个成员存储在这样的向量中:

矢量类

vector<double> classCounts;
vector<double> classVal;
...
vector<vector<double> > classSumVectorC;
...
Run Code Online (Sandbox Code Playgroud)

然后运作:

for(int i = 0; i < classes.size(); i++)
{
  result[i] += classCounts[i];
  ...
}
Run Code Online (Sandbox Code Playgroud)

哪种方式通常会更快(跨x86/x64平台和编译器)?预测和缓存行是最重要的事情吗?

更新

我在这里进行线性搜索(即查找)而不是哈希映射或二进制搜索的原因是因为sumVectors非常短,大​​约有4或5个元素.分析显示哈希映射较慢,二进制搜索稍慢.

lot*_*har 8

由于两种变体的实现看起来很容易,我会构建两个版本并对它们进行分析以找到最快的版本.

经验数据通常胜过猜测.