C#中的for循环和while循环

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

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

在for循环和while循环中,哪一个在性能方面更好?

6个回答

50

(更新) 事实上,有一种情况下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

从“明确赋值”(Definite assignment)的角度来看,下面的代码:

int i;

i = 0;

与这段代码本质上是等价的:

int i = 0;

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

使用针对for语句的continue语句将被翻译为针对标签LLoop的goto语句。如果从for语句中省略了for条件,那么在上述扩展中,评估明确赋值会按照替换为true的方式进行。

现实情况并非如此,编译器不一定完全按照这种方式处理。


你能提供有关提升长度断点优化的来源和引用吗? - Krythic
@Krythic 刚刚偶然发现了 Jon Skeet 的博客文章:https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/,与数组和列表的 for 循环和 foreach 循环有关。 - Kevin Streicher
NoxMortem 谢谢。 - Krythic
你可以通过这个链接学习:https://code2night.com/Tutorials/Article/Csharp-Tutorials。在这个博客中,解释非常清晰易懂。 - Shubham

12

我认为它们是相同的,而且你永远不应该进行这样的微观优化。


6

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


4

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

使用for循环和while循环来削减1-2个周期,永远不会使慢速程序变快,也不会使快速程序变慢。

如果您想在此部分改善程序性能,请找到一种方法来部分展开循环(参见达夫设备),或者改进循环内部操作的性能。


2

两者都一样。你可以把'for'循环看作是写while循环的更简洁方式。


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接