IF,ELSE语句/循环和变量赋值:代码优化最佳实践

时间:2013-10-20 15:16:00

标签: performance optimization

我在这里有一些简单而非常基本的问题,但我想永远结束一次,所以我决定要求。 好的,这里有代码和问题:

就像是

for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1; // x is something

更好
for (n=0;n<length;++n) {
  if (n != x) countsc[n]=0;
  else countsc[n]=1;
}

for (n=0;n<length;++n) countsc[n]=(n != x ? 0 : 1);

在性能和优化方面(速度,CPU和内存使用情况)? 如何测量它的方便方式,例如,使用Javascript和/或PHP?答案是否通常适用于所有编程语言,或者它可能有所不同?

以类似的方式,类似

a=0;
if (condition == true) a=1;

通常优于

if (condition == true) a=1;
else a=0;

a = (condition == true ? 1 : 0);

条件通常是假的吗?

4 个答案:

答案 0 :(得分:2)

可能不是您正在寻找的答案,但总的来说,我认为没有一种通用的方法可以从代码的静态分析中找出答案。这不仅取决于语言,还可能取决于您运行它的架构。我怀疑任何半合适的编译器都应该对它们进行优化,因此几乎没有差异,但对于解释型语言可能不太可能。

如果它确实是性能关键的代码部分(并且您只能通过分析知道),那么您将获得的最佳答案是通过分析和比较目标体系结构中的两个候选代码部分,使用相关的语言。

答案 1 :(得分:0)

取决于编译器(或解释器,如果适用)的质量,

for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1;

更容易优化,因为没有分支(错误)预测。与每次迭代测试countsc[x]的需要相比,设置n的次要重复是微不足道的,并且在

循环内对错过的分支预测的惩罚
for (n=0;n<length;++n) {
  if (n != x) countsc[n]=0;
  else countsc[n]=1;
}

就分支预测而言,第三个使用三元运算符的示例与第二个示例相同。

但是,除非这是一个经常执行的紧密内循环和/或非常大的length值,否则使用哪种方法查看程序的整体运行时间并不重要。< / p>

答案 2 :(得分:0)

for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1;

是性能更高的选项,假设比较和分配的成本大致相同。

类似地,

if (condition) a=1; // boolean == true is not pretty
else a=0;

应该更高效;你只有一个任务和一个跳跃,而你有最多两个任务和一个跳转与替代版本。这个版本

a = (condition == true ? 1 : 0);

应该同样好,我希望它编译成与if-else版本相同的代码。

答案 3 :(得分:0)

我会想

for (n = 0; n < x; ++n)
    countsc[n] = 0;
countsc[x] = 1;
for (n = x + 1; n < length; ++n)
    countsc[n] = 0;

比使用条件更好,并且避免重写你的countc [x]。当然,一切都是O(n),你不会注意到程序速度的任何变化。