【发布时间】:2009-04-23 00:15:25
【问题描述】:
我有一个包含许多双精度值的类。这存储在一个向量中,其中类的索引很重要(它们是从其他地方引用的)。这个类看起来像这样:
类向量
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<double> classCounts;
vector<double> classVal;
...
vector<vector<double> > classSumVectorC;
...
然后操作为:
for(int i = 0; i < classes.size(); i++)
{
result[i] += classCounts[i];
...
}
哪种方式通常更快(跨 x86/x64 平台和编译器)?前瞻和缓存行是这里要考虑的最重要的事情吗?
更新
我在这里进行线性搜索(即查找)而不是哈希映射或二进制搜索的原因是 sumVectors 非常短,大约 4 或 5 个元素。分析显示哈希映射较慢,二分查找稍慢。
【问题讨论】:
-
不,绝对不是,我正在优化聚类算法中的内部循环,并且想知道这两种方法之间的权衡。
-
@Khaki 实现似乎很容易构建两者并进行良好的旧测量:-)
标签: c++ performance arrays stl