更快,更少的内存如果

Faster, less memory if?

本文关键字:内存 如果 更快      更新时间:2023-10-16

我想知道什么更快,使用更少的内存,我会假设它是这个块,但它们可能是相同的:

if((X[i] == 0 && Y[i] == 0) ||
    (X[i] == 1 && Y[i] == 1) ||
    (X[i] == 0 && Y[i] == 2) ||
    (X[i] == -1 && Y[i] == 3) ||
    (X[i] == -2 && Y[i] == 2) ||
    (X[i] == -3 && Y[i] == 1) ||
    (X[i] == -4 && Y[i] == 0)) cout << "DA";

或者也许是这个块:

if(X[i] == 0 && Y[i] == 0) cout << "DA";
else if(X[i] == 1 && Y[i] == 1) cout << "DA";
else if(X[i] == 0 && Y[i] == 2) cout << "DA";
else if(X[i] == -1 && Y[i] == 3) cout << "DA";
else if(X[i] == -2 && Y[i] == 2) cout << "DA";
else if(X[i] == -3 && Y[i] == 1) cout << "DA";
else if(X[i] == -4 && Y[i] == 0) cout << "DA";

还是有更快的方法?谢谢。

如果你的编译器有任何价值,两者都会导致完全相同的编译代码。
也许例外,如果您禁用所有优化,这种情况根本不需要优化。

因此,请使用更清晰的代码,如果有疑问,则使用较短的代码:
使用第一个变体。

如果要优化,请考虑计算X[i],如果它们很昂贵(不太可能),则仅Y[i]一次。
此外,您可以根据可能性进行排序(尽管如果测试足够少,也可能不值得)。
您还可以尝试将短路运算符更改为非短路,以避免跳跃(这可能会适得其反)。

顺便说一句,在这种情况插入可能会将条件测试降级为性能方面的微不足道。

首先我要说的是,您在这里无法执行的任何操作都可能对速度或内存使用量产生任何明显的差异。一个简单的事实是,导致写入cout的逻辑所花费的时间将完全消失在噪声中。写入cout本身的大部分时间都是如此之大,并且(至少通常)变化如此之大,以至于其余逻辑的时间是 100% 无关紧要的。

也就是说,您几乎可以肯定地将其余的逻辑减少一点。x[i] == 0 && y[i] == 0 的第一次检查可以减少到 x[i] | y[i] == 0 个。看起来其余的可以减少到unsigned(x[i])+4u < 5u && x[i] + y[i] == 2.

这将 6 个条件减少到 3 个条件 + 一点点数学。如果这是在没有任何I/O的紧密循环中,我希望它明显更快(但结果是对流的写入,您甚至可能无法可靠地测量差异,更不用说注意到差异了)。

就个人而言,为了清晰和很少重复,我会选择第一个。

还要利用捷径:将最有可能的情况放在首位。

如果 X 和 Y 是具有昂贵的重载 [] 运算符的类的实例,则预先计算 X[i]Y[i] 。请注意,对于三元类型,[]与变量访问一样便宜。如果 X 和 Y 是模板的实例,则始终预先计算,以防万一[]对于特定类型来说成本高昂。

相关文章: