繁体   English   中英

c#中的for和while循环

[英]for and while loop in c#

for (i=0 ; i<=10; i++)
{
    ..
    ..
}

i=0;
while(i<=10)
{
    ..
    ..
    i++;
}

在 for 和 while 循环中,哪个更好,性能明智?

(更新)实际上 - 在一种情况下for构造更有效; 在数组上循环。 只要您在条件中使用arr.Length 编译器/JIT 就会针对这种情况进行优化:

for(int i = 0 ; i < arr.Length ; i++) {
    Console.WriteLine(arr[i]); // skips bounds check
}

在这种非常特殊的情况下,它跳过边界检查,因为它已经知道它永远不会越界。 有趣的是,如果您“提升” arr.Length以尝试手动优化它,您可以防止这种情况发生:

int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
    Console.WriteLine(arr[i]); // performs bounds check
}

然而,对于其他容器( List<T>等),提升作为手动微优化是相当合理的。

(结束更新)


两者都不; 无论如何,for 循环在引擎盖下被评估为 while 循环。

例如 ECMA 334(明确分配)的 12.3.3.9 规定了 for 循环:

for ( for-initializer ; for-condition ; for-iterator ) embedded-statement

本质上是等价的(从明确赋值的角度来看(与说“编译器必须生成这个 IL”不完全相同))为:

{
    for-initializer ;
    while ( for-condition ) {
        embedded-statement ;
        LLoop:
        for-iterator ;
    }
}

将针对 for 语句的 continue 语句转换为针对标签 LLoop 的 goto 语句。 如果 for 条件从 for 语句中省略,则确定赋值的评估继续进行,就好像 for-condition 在上述扩展中被替换为 true。

现在,这并不意味着编译器必须做完全相同的事情,但实际上它几乎可以......

我会说它们是相同的,无论如何你都不应该做这样的微优化。

性能将是相同的。 但是,除非您需要在循环外访问i变量,否则您应该使用for循环。 这会更干净,因为i只会在块内有范围。

程序效率来自适当的算法、良好的对象设计、智能程序架构等。

使用 for 循环与 while 循环减少一两个循环永远不会使慢程序变快,或使快速程序变慢。

如果您想在本节中提高程序性能,请找到一种方法来部分展开循环(请参阅Duff 的设备),或者提高循环内部执行的性能。

没有一个。 它们是等价的。 您可以将“for”循环视为编写 while 循环的更紧凑的方式。

是的,它们是等效的代码片段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM