Hice la aplicación de prueba rápida para comparar la clasificación LINQ a Array.Sort en mis objetos personalizados. ¡Array.Sort parece extremadamente lento!¿Por qué Array.Sort() es tan lento en comparación con LINQ?
hice mi clase personalizada como esto:
class Person : IComparable<Person>
{
public int Age { get; set; }
public string Name { get; set; }
public int CompareTo(Person obj)
{
return this.Age.CompareTo(obj.Age);
}
public Person()
{ }
}
Entonces hice mis pruebas de personas en main():
string name = "Mr. Tomek";
Random r = new Random();
int size = 10000000;
DateTime start, end;
Person[] people1 = new Person[size];
Person[] people2 = new Person[size];
for (int i = 0; i < size; i++)
{
people1[i] = new Person();
people1[i].Age = r.Next(0, 10000);
people1[i].Name = name;
people2[i] = new Person();
people2[i].Age = people1[i].Age;
people2[i].Name = people1[i].Name;
}
Después de ese tiempo he tomado medida de Ordenar por Array.Sort y por LINQ: tiempo
start = DateTime.Now;
var sort = from s in people2
orderby s.Age
select s;
end = DateTime.Now;
Console.WriteLine("LINQ: ");
Console.WriteLine((end - start).TotalMilliseconds);
start = DateTime.Now;
Array.Sort(people1,((Person p1, Person p2)=>{return p1.CompareTo(p2);}));
end = DateTime.Now;
Console.WriteLine("IComparable: ");
Console.WriteLine((end - start).TotalMilliseconds);
Console.ReadLine();
Linq: alrededor de 1 o 2 milisegundos
Array.Sort: más de 16 SECONDS!
Todas las matrices están ordenadas (LINQ produce una nueva colección y deja oryginal array sin clasificar) pero Array.Sort es extremadamente lenta. ¿Cómo podría ser explicado? (en modo DEBUG y RELEASE Array.Sort falla extremadamente)
Pegué el código con la expresión lambda al ordenar con Array.Sort pero es lo mismo con y sin él. (Persona de clase implementa la interfaz IComparable)
Puede que le interese mi pregunta relacionada. http://stackoverflow.com/questions/10110013/order-of-linq-extension-methods-does-not-affect-performance –
@TomaszSikora: Simplemente puede ordenar llamando a 'Array.Sort (people1)', ya que La implementación 'IComparable' se usa automáticamente. –
Me di cuenta de algo ... Linq es más rápido al ordenar matrices más grandes. Array.Sort es más rápido cuando Array tiene menos de 100 000 elementos. ¿Por qué está sucediendo eso? –