C# 兩種遍歷列表的方式,哪種更高效?

class Program

{

static void Main(string[] args)

{

List& list = new List&() { 2, 3, 4, 56, 7, 9, 0, 22 };

//第一種方式,把排序後的結果放到一個中間變數里,再遍歷中間變數

var tmpList = list.OrderBy(m =&> m);

foreach (var item in tmpList)

{

Console.Write(item + " ");

}

//第二種方式,省略中間變數,直接遍歷排序結果

foreach (var item in list.OrderBy(m =&> m))

{

Console.Write(item + " ");

}

//我使用 System.Diagnostics.Stopwatch 計算兩種方式耗費的時間,

//發現比較結果不固定,有時方式一快,有時方式二快,

//想問一問,這兩種方式到底哪種更高效?

}

}


題主有這樣的疑問是值得鼓勵的, 看IL分析性能是解決這類疑問的好方法,除此之外再對你的代碼補充幾點:

1. c#的for,foreach圓括弧中的表達式都只會計算一次——即使你把OrderBy放到foreach中,也只會在循環開始時排序一次。

2. 編譯器會優化你的代碼,你的中間變數只在循環里使用,所以第1段和第2段代碼編譯完的IL是一樣的。假如你將中間變數做為方法返回值,那麼IL就不同了,你可以自己看看。(看IL可以使用ILSPY工具,免費的)

3. 用StopWatch沒問題,但是你的數據量太小了,即使你兩段代碼真有性能上的差異,這麼點數據量也很難測出來。至少弄個幾萬個才有說服力。

以上。


看IL,看彙編代碼,你不用看得懂也能知道答案。


這當然是完全一樣的……這就相當於是問:if (a &< SomeFunc()) ; 和 var x = SomeFunc(); if (a &< x) ; 誰快一樣。

你要搞出不一樣是比如 ToList 或者 ToArray 一下,那會產生額外的開銷。


一樣的,linq是延遲執行的,order by那個方法只有到foreach的時候才會真正執行一下。


其實是C++最高...


我記得Linq只是一個expression ,在tolist 或要求結果前類似一個func,不產生操作和開銷,當你foreach 開始後,expression 執行而產生一個enmurable 的結果去讓foreach找,所以理論上兩者應該是一樣的


完全一樣,你代碼不用中間變數,實際運行也會生成一個臨時變數使用


兩者一摸一樣。運行時間看臉。


根本沒區別吧……


當然不固定,兩者是完全一致的。


我感覺應該是一樣的。


第二種更高效

分別運行1000次,結果為:


推薦閱讀:

為什麼數據分析需要會編程語言?
為什麼很多語言中,要用三個引號或其他符號來表示多行字元串字面量?
關於 Type Inference 的各種應用和學習資料?
三宮六院七十二妃(程序YUAN版)

TAG:編程語言 | 演算法 | C# |