`for`循环 - 性能测试表达式中的数学运算,优化

问题描述:

我很感兴趣,这些形式的for循环测试表达式中的哪一种更合适(从性能和良好的代码实践来看):`for`循环 - 性能测试表达式中的数学运算,优化

for(i = 0; i < size - 1; i++) { 
    do something 
} 

int decreased_size = size - 1; 
for(i = 0; i < decreased_size; i++) { 
    do something 
} 

是在第一实施例计算每一次测试表达式size - 1或不编译器优化它到恒定值,所以没有必要创建一个额外的变量decreased_size

我一直在创造一个额外的变量,但现在,看着Codeforces上的其他解决方案,我怀疑 - 是否有意义?

编译:GCC 5.4.0版本20160609

+0

取决于编译器是否可以100%确定地确定“大小”在循环内不能更改。但通常这个额外的变量是浪费打字。 – Mat

+4

构建优化的可执行文件。检查生成的机器代码。这是了解编译器将做什么的唯一方法。 –

+2

第三选择:'for(i = 0; i + 1 chux

没有人让比其他更有意义。事实上,与优化,它会产生相同的代码:https://godbolt.org/g/vzVJVF

其次,size-1是,在大多数情况下,可以忽略不计的在循环动作所消耗的时间面对面的人消耗的时间,因此优化这部分有一个非常小的影响在系统上。

总之,只有在需要时才进行优化(所以您会发现存在时间/内存问题)。在每一天,更喜欢一个可读,易于理解的代码。

+0

在第二个for(int i = 0; i MiniMax

+1

更正后的版本:https://godbolt.org/g/vzVJVF – MiniMax

+0

@MiniMax非常感谢 – Garf365

我同意@ Garf365。如果你也看看https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm,你会看到循环计数在循环开始之前被加载到寄存器中,所以size-1必须被计算并加载只有一次