【发布时间】:2010-07-26 10:45:09
【问题描述】:
我感兴趣的是使用 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<Int> 测试它时,List.Sort 的速度是 LINQ 的 1/4,保持在 2000 左右。
那么,为什么 LINQ 对于我的班级来说只有正常排序速度的 66% 左右?我的 IComparable 实现有问题吗?
更新: 我只是想尝试在发布模式下进行,是的,结果不同:
IComparable<T>:
1593.0911
Linq:
1958.1119
但我仍然很想知道为什么 IComparable 在调试模式下速度较慢。
【问题讨论】:
-
您是否尝试在调试模式(项目属性)中设置优化并查看它是否仍然较慢?如果不是,那可以解释它。
-
优化代码已打开...我正在寻找实际原因而不是促成因素。我不是要解决这个问题,这两种方法对我的目的来说都足够快,我只是想知道为什么。
标签: c# linq sorting benchmarking