我感興趣的是,使用LINQ對我的類進行排序,還是通過實現IComparable接口和List.Sort,會更快。當LINQ代碼更快時,我感到非常驚訝。爲什麼是List <>。OrderBy LINQ比IComparable + List <>更快。
爲了做這個測試,我做了一個非常簡單的類,使用TestSort的不太合適的名稱,實現了IComparable。
class TestSort: IComparable<TestSort> {
private int age;
private string givenName;
public int Age {
get {
return age;
}
set {
age = value;
}
}
public string GivenName {
get {
return givenName;
}
set {
givenName = value;
}
}
public TestSort(int age, string name) {
this.age = age;
this.givenName = name;
}
public int CompareTo(TestSort other) {
return this.age.CompareTo(other.age);
}
}
然後一個簡單的程序,它很多次排序 - 排序是不是複製表要貴得多,所以這種影響可以忽略不計。
class Program {
static void Main(string[] args) {
// Create the test data
string name = "Mr. Bob";
Random r = new Random();
var ts2 = new List<TestSort>();
for (int i = 0; i < 100; i++) {
ts2.Add(new TestSort(r.Next(), name));
}
DateTime start, end;
// Test List<>.Sort
start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
var l = ts2.ToList();
l.Sort();
}
end = DateTime.Now;
Console.WriteLine("IComparable<T>: ");
Console.WriteLine((end - start).TotalMilliseconds);
// Test Linq OrderBy
start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
var l = ts2.ToList();
l = l.OrderBy(item => item.Age).ToList();
}
end = DateTime.Now;
Console.WriteLine("\nLINQ: ");
Console.WriteLine((end - start).TotalMilliseconds);
Console.WriteLine("Finished.");
Console.ReadKey();
}
}
我很驚訝地收到以下輸出:
IComparable<T>:
2965.1696
LINQ:
2181.1248
LINQ有時會去低於2000,有時IComparable的會去約3000
當我與一個正常測試它List<Int>
List.Sort
是LINQ的1/4的速度,它保持在2000左右。
那麼LINQ爲什麼只有ab我的班級正常排序的速度是66%嗎?我是否在執行IComparable時出錯?
更新: 我只是想嘗試在釋放模式做,是的,結果是不同的:
IComparable<T>:
1593.0911
Linq:
1958.1119
但我還是很有興趣知道爲什麼了IComparable處於調試模式慢。
你有沒有嘗試在調試模式(項目屬性)設置優化,看看它是否仍然較慢?如果沒有,那可能會解釋它。 – Gishu 2010-07-26 10:58:51
開啓優化代碼...我正在尋找一個真正的原因,而不是一個促成因素。我並沒有試圖解決這個問題,兩種方法對我而言都足夠快,我只想知道爲什麼。 – 2010-07-26 11:09:42