【发布时间】:2010-11-25 08:28:25
【问题描述】:
我的程序的最内部循环中有以下代码
struct V {
float val [200]; // 0 <= val[i] <= 1
};
V a[600];
V b[250];
V c[250];
V d[350];
V e[350];
// ... init values in a,b,c,d,e ...
int findmax(int ai, int bi, int ci, int di, int ei) {
float best_val = 0.0;
int best_ii = -1;
for (int ii = 0; ii < 200; ii++) {
float act_val =
a[ai].val[ii] +
b[bi].val[ii] +
c[ci].val[ii] +
d[ci].val[ii] +
e[ci].val[ii];
if (act_val > best_val) {
best_val = act_val;
best_ii = ii;
}
}
return best_ii;
}
我不在乎它是一些聪明的算法(但这会是最有趣的)还是一些 C++ 技巧或内在函数或汇编程序。但我需要让 findmax 函数更高效。
非常感谢。
编辑: 似乎分支是最慢的操作(预测错误?)。
【问题讨论】:
-
你能告诉我们更多关于外循环的信息吗?或许与此相结合,优化的可能性会更大。
-
微优化,这意味着它可以由编译器处理,但并没有真正受到伤害,而且我看到了相当令人惊讶的基准测试,说明它有时会产生多大的差异:将 i++ 切换为 ++一世。这样,值在递增之前永远不会被复制。
标签: c++ algorithm performance intrinsics