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个元素.分析显示哈希映射较慢,二进制搜索稍慢.
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |