最近我用C编写了一个程序。在代码执行过程中,数据计算是瓶颈。如下:
数据结构是:
typedef struct tuple_t{
int oid;
int min_x;
int min_y;
int max_x;
int max_y;
}tuple_t
代码是
for (i = 0; i < Qry->num_tuples; i++) {
tuple_t Qi = Qry->tuples[i];
for (j = 0; j < Obj->num_tuples; j++) {
tuple_t Oj = Obj->tuples[j];
int test_top_bit = (Oj.min_x - Qi.min_x) | (Qi.max_x - Oj.min_x)
| (Oj.min_y - Qi.min_y) | (Qi.max_y - Oj.min_y);
test_top_bit >= 0 ? matches++ : 0;
}
} 该代码用于测试点是否在二维矩形中。 Qry-> num_tuples和Obj-&gt; num_tuple是500万。我运行测试,时间是887百万秒。 我测试了clasue
if(Oj.min_x == Qi.min_x)
count++;
时间只有300万秒。所以主要的时间花在了这个条款上:
int test_top_bit = (Oj.min_x - Qi.min_x) | (Qi.max_x - Oj.min_x)
| (Oj.min_y - Qi.min_y) | (Qi.max_y - Oj.min_y);
test_top_bit >= 0 ? matches++ : 0;
我使用了另一种连接算法,但时间仍然很长。
有没有改善测试的性能?SIMD的SSE可以使用吗?
答案 0 :(得分:1)
看看这一行,我发现了一个性能问题:
tuple_t Oj = Obj->tuples[j];
除了清洁代码之外,你无缘无故地复制这个结构25万亿次。 请尝试使用指针。 tuple_t * pOj =&amp; Obj-&gt; tuples [j];
你也可以避免分支:
匹配+ =((Oj.min_x - Qi.min_x)|(Qi.max_x - Oj.min_x)| (Oj.min_y - Qi.min_y)| (Qi.max_y - Oj.min_y))&gt; = 0;