而Loop vs For循环,这是更高的内存效率!

时间:2011-10-15 18:08:00

标签: java c

现在我已经习惯了在内存限制条件下进行编程,我没有答案的一个问题是:哪个内存效率更高; - (;;)还是while()?或者它们是否可以互换?如果有的话,还要评论效率问题!

5 个答案:

答案 0 :(得分:6)

编程语言构造forwhile之间的内存使用没有区别。给定的编译器可能会更好地优化其中一个,但您不必担心这一点。对于内存约束条件,最重要的是您的数据结构和系统设计。糟糕的系统设计可能需要更多内存。

答案 1 :(得分:3)

唯一可以确定的方法是使用 编译器为 平台进行测试。但我认为任何足够先进的优化C编译器都会在大多数情况下优化它们。

答案 2 :(得分:2)

for(init;cond;inc){
//...
}

(几乎)与

完全相同
init;
while(cond){
//...
inc;
}

不同之处在于for continue;也会执行inc;,但您必须在此时手动执行此操作

并且init;语句中声明的变量被约束为for(它引入了一个新范围)但是在while中不是这种情况

这使得for循环在几种情况下更容易使用(例如,对数组进行迭代)但是编译后的代码可能是相同的,因此选择一个而不是另一个的唯一原因是可读性

注意我说的主要是关于java我不知道c中的具体细节,以便对此发表评论

答案 3 :(得分:0)

嗯,这取决于编译器...但想到这样:

while(x){
x++;
}

使用您在循环范围之外声明的变量,这意味着您正在使用已为循环创建的数据。

for循环只为循环内部的循环初始化变量。

for(int x = 0; x > y; x++{
}

因此,如果你有一个变量只是坐在那里有一个你可以使用的值,那么while循环很可能(取决于编译器)对这种情况更好。但是如果你需要为循环创建变量,我会使用for循环。

希望这会有所帮助。

答案 4 :(得分:0)

我在使用时钟的c程序中做了一些测试,结果没有结果..所以我写了代码

for(int i=0;i< 100000000; i++){
    g+=2;    
}

和代码

int i2 = 0;
while(i2 < 100000000){
    g+=2;    
    i2++;
}

使用gcc在dev c ++中编译时,程序集分解为完全相同的字节码......

CPU Disasm;
Address   Hex dump          Command                                  Comments
0040160C  |.  C745 E0 00000 MOV DWORD PTR SS:[LOCAL.8],0
00401613  |>  817D E0 FFE0F /CMP DWORD PTR SS:[LOCAL.8],5F5E0FF
0040161A  |.  7F 0D         |JG SHORT 00401629
0040161C  |.  8D45 E4       |LEA EAX,[LOCAL.7]
0040161F  |.  8300 02       |ADD DWORD PTR DS:[EAX],2
00401622  |.  8D45 E0       |LEA EAX,[LOCAL.8]
00401625  |.  FF00          |INC DWORD PTR DS:[EAX]
00401627  |.^ EB EA         \JMP SHORT 00401613

这两组代码都会反汇编到那个精确的程序集中,因此你可以看到它们同样一样好。再加上时钟测试总是以一次更快的速度返回,另一次更快,另一次证明它...

如果你想要有效率,你可以在反汇编程序中找到你的代码并手动优化它;)

例如,这些循环可以像这样表示

CPU Disasm
Address   Hex dump          Command                                  Comments
00401492  |.  60            PUSHAD
00401493  |.  31DB          XOR EBX,EBX
00401495  |.  31C0          XOR EAX,EAX
00401497  |>  81FB FFE0F505 /CMP EBX,5F5E0FF
0040149D  |.  7F 05         |JG SHORT 004014A4
0040149F  |.  40            |INC EAX
004014A0  |.  40            |INC EAX
004014A1  |.  43            |INC EBX
004014A2  |.^ EB F3         \JMP SHORT 00401497
004014A4  |>  8945 E4       MOV DWORD PTR SS:[LOCAL.7],EAX
004014A7  |.  61            POPAD

您可以将两个INC EAX更改为ADD EAX,但是这又使用了1个字符我不想丢失:)

这种优化的运行速度大约是原来的两倍:)