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
LINQ
tiene que gastar memoria adicional en comparación con unaList<T>.Sort
implementació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)Sort
superaOrderBy
en 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.ToArray
llamada 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
OrderBy
está 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
OrderBy
consulta, también estaría tentado a usar:(para
{yourchoice}
uno deCurrentCulture
,Ordinal
oInvariantCulture
).List<T>.Sort
Enumerable.OrderBy
fuente
Enumerable.OrderBy
y 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.Sort
yEnumerable.OrderBy
se 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
OrderBy
es un poco más rápido queList.Sort
cuando se enfrenta a una entrada ya ordenada. Modifiqué su código para que ordene repetidamente los datos sin clasificar y,OrderBy
en la mayoría de los casos, sea un poco más lento.Además, la
OrderBy
prueba utilizaToArray
para 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 enToList
lugar deToArray
y obtuve una diferencia aún mayor:El código:
fuente
OrderByWithToList
toma el mismo tiempo queOrderBy
.Creo que es importante notar otra diferencia entre
Sort
yOrderBy
: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
CalculateSalary
método n veces, mientras que laSort
opción puede llamarCalculateSalary
hasta 2 n log ( n ) veces, dependiendo del éxito del algoritmo de ordenación.fuente
n
times. 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