2013-10-20 36 views
0

我在这里有一些简单而非常基本的问题,但是我希望永久结束一次,所以我决定要求。 好吧,这里谈到的代码和问题中:IF,ELSE语句/循环和变量赋值:代码优化最佳实践

是一样的东西

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); 

当条件通常是假的更好吗?

+0

优化的第一条规则:**不要做**第二条规则:**不要做_yet _ ** – Makoto

+0

的条件是循环不变。使用两个循环。 – wildplasser

+0

@Makoto:我会记住的(滑稽:D) – danicotra

回答

0

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

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

更易于优化,因为有至(MIS)无分支预测。设置countsc[x]两次的次复制是微不足道相比,需要测试n为错过的分支预测每一次迭代和处罚

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

内环路在分支预测方面,您有三元运算符第三个例子是与第二个相同。

但是,除非这是一个紧密的内部循环,否则要么执行频繁,要么对于非常大的值length,使用哪种方法查看程序的总体运行时间不太可能发生。

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版本相同的代码。

2

也许不是你要找的,但总的来说,我不认为会有从代码的静态分析,这出一般的方式回答。这不仅会因语言而异,而且还可能由您运行它的体系结构决定。我怀疑任何一半体面的编译器都应该优化这些,所以几乎没有区别,但是对于解释型语言来说这可能不太可能。

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

0

我想

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

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