Performances de OrderBy (). Last () ou OrderByDescending (). First ()

Je sais que c’est probablement de la micro-optimisation, mais je me demande quand même s’il y a une différence d’utilisation

var lastObject = myList.OrderBy(item => item.Created).Last(); 

ou

 var lastObject = myList.OrderByDescending(item => item.Created).First(); 

Je cherche des réponses pour Linq aux objects et Linq aux entités.

En supposant que les deux méthodes de sorting prennent le même temps (et que ce soit un «si» .Last() , la première méthode aurait le coût supplémentaire de faire une .Last() , nécessitant potentiellement une énumération complète.

Et cet argument est probablement encore plus valable pour un LINQ orienté SQL.

(Ma réponse concerne Linq to Objects, pas Linq to Entities)

Je ne pense pas qu’il y ait une grande différence entre les deux instructions, il s’agit clairement d’un cas de micro-optimisation. Dans les deux cas, la collection doit être sortingée, ce qui signifie généralement une complexité de O(n log n) . Mais vous pouvez facilement obtenir le même résultat avec une complexité de O(n) , en énumérant la collection et en gardant une trace de la valeur minimale ou maximale. Jon Skeet fournit une implémentation dans son projet MoreLinq , sous la forme d’une méthode d’extension MaxBy :

 var lastObject = myList.MaxBy(item => item.Created); 

Dans les deux cas, cela dépend un peu de vos collections sous-jacentes. Si vous avez une bonne connaissance de l’apparence des collections avant la commande et si vous faites votre choix, vous pouvez en choisir une sur l’autre. Par exemple, si vous savez que la liste est généralement sortingée par ordre croissant (ou dans l’ordre croissant), vous pouvez préférer le premier choix. Ou si vous savez que des index sur les tables SQL sont sortingés par ordre croissant. Bien que l’optimiseur SQL puisse probablement y faire face de toute façon.

Dans un cas général, ce sont des déclarations équivalentes. Vous aviez raison lorsque vous avez parlé de micro-optimisation.

Je suis désolé, cela ne répond pas directement à votre question, mais …

Pourquoi ne pas faire une meilleure optimisation et utiliser les implémentations de MaxBy ou de MinBy de Jon Skeet?

Ce sera O (n) par opposition à O (n log n) dans les deux alternatives que vous avez présentées.

En supposant que OrderBy et OrderByDescending donnent en moyenne les mêmes performances, le fait de prendre le premier élément serait meilleur que le dernier lorsque le nombre d’éléments est grand.

juste mes deux cents: puisque OrderBy ou OrderByDescending doivent de toute façon itérer sur tous les objects, il ne devrait y avoir aucune différence. Cependant, si c’était mon cas, je ferais probablement une foreach boucle de tous les éléments d’une foreach avec une comparaison pour conserver l’élément le plus comparé, à savoir une recherche O (n) au lieu de l’ordre de grandeur du sorting.