我有一个包含许多 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/