c++ - 性能:类的 vector 或包含 vector 的类

标签 c++ performance arrays stl

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

类 vector

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

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

vector<A> classes(10000);

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

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;
}

替代方法是将计算分成两个单独的循环,而不是一个巨大的循环,例如:

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;
}

或者像这样将类的每个成员存储在一个 vector 中:

vector 类

vector<double> classCounts;
vector<double> classVal;
...
vector<vector<double> > classSumVectorC;
...

然后操作为:

for(int i = 0; i < classes.size(); i++)
{
  result[i] += classCounts[i];
  ...
}

哪种方式通常更快(跨 x86/x64 平台和编译器)?前瞻和缓存行是这里要考虑的最重要的事情吗?

更新

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

最佳答案

由于这两种变体的实现看起来都很容易,所以我会构建这两个版本并分析它们以找到最快的一个。

经验数据通常胜过推测。

关于c++ - 性能:类的 vector 或包含 vector 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/779791/

相关文章:

sql-server - 如何更有效地编写此查询?

C# 应用程序每次调用都需要更多内存

c++ - 如何在 C++ 中被 EOF 停止后恢复输入流?

c++ - 将一维数组视为二维数组

python - 优化大量数据的搜索和插入操作

arrays - Perl一个数组的所有排列

c++ - 我如何使用带有类的数组

java - 如何按字典顺序对二维数组进行排序?

c++ - 复制省略误区

c++ - 动态分配的数组未释放