【发布时间】:2020-04-13 14:15:18
【问题描述】:
我正在解决一个问题,这里有一段代码的运行情况比理论上的预期差很多:
inline bool check(const int index, const float* f) const{
for(int j=0; j<d; j++)
if(points[index][j] != f[j])
return false;
return true;
}
bool func(int p_cap, const float* f) const{
int i = (p_cap - error > 0? p_cap - error: 0);
int l = (p_cap + error + 1 < keyCount? p_cap + error + 1: keyCount);
for(; i<l; i++)
if(check(i, f))
return true;
return false;
}
这些函数在一个类中,points 和 keyCount 都是该类的成员。 points 是一个keyCount*d 二维数组。 d 是一个全局变量。关于如何优化此代码块的任何帮助?谢谢...
编辑:
我正在使用插值在数组中进行搜索,并且我的数据是可能的。期望使用这种技术搜索任何点都会比线性搜索更快。我有这个期望的原因是因为error = 1。这意味着,对于任何一点,我都在查看 3 数组中的最多 3 不同点。我有一百万个这样的数组。每个存储正好 10 个点。线性搜索的预期值为N/2,这意味着我需要在到达查询点之前查看5(同样,预期/平均值)。因此,这个“插值代码”应该比线性搜索运行得更快,但这并没有发生。
使用的编译命令:
g++ -O3 -march=native -DNDEBUG test.cpp -o test
【问题讨论】:
-
d的值是多少? -
理论预期是什么?
-
check()没有尺寸检查,很好。如果你有除 O(n) 以外的任何期望,那你就是在做梦。看起来您必须在最坏的情况下检查整个阵列。你也没有展示你是如何测量的,你的期望是什么等。获得更快的唯一方法是尽可能对数组进行排序并实现更快的搜索。 -
@PaulMcKenzie d 通常是 2 或 3
-
@bipll 我正在使用插值在数组中进行搜索,并且预计会比线性搜索更好
标签: c++ function loops optimization