我想知道使用LINQ还是实现IComparable接口和List.Sort来对我的类进行排序是否更快。当我尝试使用LINQ时,我很惊讶它比后者更快。
为了进行测试,我创建了一个非常简单的类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进行测试时,List.Sort的速度是LINQ的1/4,而LINQ的速度保持在约2000左右。
那么为什么对于我的类而言,LINQ只有普通排序速度的66%?我在实现IComparable时有错误吗?
更新: 我刚才尝试在发布模式下运行,结果确实不同:
IComparable<T>:
1593.0911
Linq:
1958.1119
但我仍然非常想知道为什么在调试模式下,IComparable会更慢。