簡體   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