c#中的for和while循环

Posted

技术标签:

【中文标题】c#中的for和while循环【英文标题】:for and while loop in c# 【发布时间】:2010-10-07 20:31:54 【问题描述】:
for (i=0 ; i<=10; i++)

    ..
    ..


i=0;
while(i<=10)

    ..
    ..
    i++;

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

【问题讨论】:

【参考方案1】:

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

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&lt;T&gt; 等),作为手动微优化,提升是相当合理的。

(结束更新)


都不是;无论如何,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 ;
    

带有目标的 continue 语句 for 语句被翻译成 针对标签的 goto 语句 循环。如果省略了 for 条件 从 for 语句,然后 确定分配的评估 就像 for-condition 一样进行 在上面替换为 true 展开。

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

【讨论】:

你能提供提升长度断裂优化的来源和引用吗? @Krythic 偶然发现了这个:codeblog.jonskeet.uk/2009/01/29/… Jon Skeet 的博文。 NoxMortem 谢谢 code2night.com/Tutorials/Article/Csharp-Tutorials可以通过链接了解。在这个博客中,解释很清楚【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

是的,它们是等效的代码 sn-ps。

【讨论】:

以上是关于c#中的for和while循环的主要内容,如果未能解决你的问题,请参考以下文章

C#视频forwhiledo-while三种循环

用C# while循环 打印 9 9 乘法表

python中的while循环与for循环怎么样那个比较好用?

c#应用控制台while循环输出九九乘法表

第六篇:循环语句 - while和for

js中for循环和while循环在使用的时候有何区别?