Puedo ordenar una lista usando Sort u OrderBy. Cual es mas rapido? ¿Ambos trabajan en el mismo algoritmo?
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
1.
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));
2.
var query = persons.OrderBy(n => n.Name, new NameComparer());
class NameComparer : IComparer<string>
{
public int Compare(string x,string y)
{
return string.Compare(x, y, true);
}
}
c#
.net
performance
sorting
sql-order-by
user215675
fuente
fuente

Respuestas:
Por qué no medirlo:
En mi computadora, cuando se compila en modo de lanzamiento, este programa imprime:
ACTUALIZAR:
Como sugirió @Stefan, aquí están los resultados de ordenar una lista grande menos veces:
Huellas dactilares:
En este escenario, parece que OrderBy funciona mejor.
ACTUALIZACIÓN2:
Y usando nombres aleatorios:
Dónde:
Rendimientos:
Aún así, OrderBy es más rápido
fuente
LINQtiene que gastar memoria adicional en comparación con unaList<T>.Sortimplementación en el lugar . No estoy seguro de si mejoraron esto en las versiones más recientes de .NET, pero en mi máquina (i7 3.ª generación de .NET 4.5 de 64 bits)SortsuperaOrderByen todos los casos. Además, al observar elOrderedEnumerable<T>código fuente, parece que crea tres matrices adicionales (primero aBuffer<T>, luego una matriz de claves proyectadas, luego una matriz de índices) antes de finalmente llamar a Quicksort para ordenar la matriz de índices en su lugar.ToArrayllamada que crea la matriz resultante. Las operaciones de memoria y la indexación de matrices son operaciones increíblemente rápidas, pero todavía no puedo encontrar la lógica detrás de estos resultados.No, no son el mismo algoritmo. Para empezar, el LINQ
OrderByestá documentado como estable (es decir, si dos elementos tienen el mismoName, aparecerán en su orden original).También depende de si almacena la consulta en búfer o la itera varias veces (LINQ-to-Objects, a menos que almacene el resultado, reordenará por
foreach).Para la
OrderByconsulta, también estaría tentado a usar:(para
{yourchoice}uno deCurrentCulture,OrdinaloInvariantCulture).List<T>.SortEnumerable.OrderByfuente
Enumerable.OrderByy profundizar en su implementación interna, puede ver que el algoritmo de clasificación OrderBy es una variante de QuickSort que realiza una clasificación estable. (VerSystem.Linq.EnumerableSorter<TElement>.) Por lo tanto,Array.SortyEnumerable.OrderByse puede esperar que ambos tengan tiempos de ejecución O (N log N) , donde N es el número de elementos de la colección.La respuesta de Darin Dimitrov muestra que
OrderByes un poco más rápido queList.Sortcuando se enfrenta a una entrada ya ordenada. Modifiqué su código para que ordene repetidamente los datos sin clasificar y,OrderByen la mayoría de los casos, sea un poco más lento.Además, la
OrderByprueba utilizaToArraypara forzar la enumeración del enumerador Linq, pero eso obviamente devuelve un tipo (Person[]) que es diferente del tipo de entrada (List<Person>). Por lo tanto, volví a ejecutar la prueba usando enToListlugar deToArrayy obtuve una diferencia aún mayor:El código:
fuente
OrderByWithToListtoma el mismo tiempo queOrderBy.Creo que es importante notar otra diferencia entre
SortyOrderBy:Supongamos que existe un
Person.CalculateSalary()método que requiere mucho tiempo; posiblemente más que incluso la operación de ordenar una lista grande.Comparar
La opción 2 puede tener un rendimiento superior, porque solo llama al
CalculateSalarymétodo n veces, mientras que laSortopción puede llamarCalculateSalaryhasta 2 n log ( n ) veces, dependiendo del éxito del algoritmo de ordenación.fuente
ntimes. Obviamente, esto no es tan conveniente como usar OrderBy.En pocas palabras:
Ordenar lista / matriz ():
OrderBy / ThenBy ():
x => x.Id.:). Todas las claves se extraen primero antes de ordenar. Esto podría resultar en un mejor rendimiento que usar Sort () y un comparador personalizado.Fuentes: MDSN , fuente de referencia y repositorio dotnet / coreclr (GitHub).
Algunas de las declaraciones enumeradas anteriormente se basan en la implementación actual del marco .NET (4.7.2). Podría cambiar en el futuro.
fuente
debe calcular la complejidad de los algoritmos utilizados por los métodos OrderBy y Sort. QuickSort tiene una complejidad de n (log n) como recuerdo, donde n es la longitud de la matriz.
También he buscado orderby's, pero no pude encontrar ninguna información ni siquiera en la biblioteca msdn. si no tiene los mismos valores y clasificación relacionados con una sola propiedad, prefiero usar el método Sort (); si no, use OrderBy.
fuente
Solo quiero agregar que orderby es mucho más útil.
¿Por qué? Porque puedo hacer esto:
¿Por qué comparador complicado? Simplemente ordene según un campo. Aquí estoy ordenando según TotalBalance.
Muy fácil.
No puedo hacer eso con el género. Me pregunto porque. Hazlo bien con orderBy.
En cuanto a la velocidad, siempre es O (n).
fuente