C# 兩種遍歷列表的方式,哪種更高效?
01-28
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版)