J'utilise .Net 3.5 et VS 2008 depuis plus d'un mois. Comme la plupart des développeurs .Net, j'ai évolué à partir d'années d'expérience dans .Net 1.0 & 2.0 et VS 2005. Tout récemment, j'ai découvert la simplicité et la puissance des expressions LINQ et Lambda, comme dans mes questions récentes telles que Trouver un élément dans la liste par LINQ , Convertir ou mapper une instance de classe à une liste d'une autre en utilisant Lambda ou LINQ , et Convertir ou mapper une liste de classe à une autre liste de en utilisant Lambda ou LINQ .
J'avoue que Lambda et LINQ sont beaucoup plus simples et faciles à lire et ils semblent très puissants. Dans les coulisses, le compilateur .Net doit générer beaucoup de code pour réaliser ces fonctions. Par conséquent, j'hésite un peu à passer à la nouvelle syntaxe, car je connais déjà "l'ancienne" manière d'obtenir les mêmes résultats.
Ma question porte sur l'efficacité et les performances de Lambda et LINQ. Peut-être que les expressions Lambda sont principalement des fonctions en ligne, dans ce cas, je suppose que Lambda devrait être correct. Et LINQ?
Limitons la discussion à LINQ-to-Objects LINQ-to-SQL (LINQ-to-SQL). Des commentaires, des comparaisons et des expériences?
Il n'y a pas une seule réponse qui suffira ici.
LINQ a de nombreuses utilisations et de nombreuses implémentations, et donc de nombreuses implications pour l'efficacité de votre code.
Comme pour chaque technologie à portée de main, LINQ peut être et sera maltraité et mal utilisé, et la capacité de faire la distinction entre cela et une bonne utilisation ne dépend que d'une chose: la connaissance.
Le meilleur conseil que je puisse vous donner est donc d'aller lire comment LINQ est réellement implémenté.
Les points à vérifier sont les suivants:
Et comme toujours, lorsque l'on regarde les questions d'efficacité, la seule approche sûre est juste de mesurer. Créez un morceau de code à l'aide de LINQ qui fait une seule chose, sachez, créez une alternative, puis mesurez les deux et essayez de vous améliorer. Deviner et supposer ne mènera qu'à de mauvais résultats.
Techniquement, le moyen le plus rapide est de contrôler vous-même toutes les minuties. Voici quelques tests de performances . Notez que le mot-clé foreach et la construction ForEach LINQ sont identiquement beaucoup plus lents que l'utilisation et l'écriture de code procédural.
Cependant, le compilateur peut et sera amélioré et vous pouvez toujours profiler votre code et optimiser les zones problématiques. Il est généralement recommandé d'utiliser les fonctionnalités plus expressives qui facilitent la lecture du code, sauf si vous avez vraiment besoin des nanosecondes supplémentaires.
Pour les requêtes LINQ, avec la "nouvelle syntaxe", l'IL (code) généré n'est fondamentalement pas différent de l'appel direct aux méthodes d'extension fournies par Enumerable et Queryable.
Ne pas optimiser prématurément. Utilisez Linq et les nouvelles méthodes d'extension si elles améliorent la lisibilité et le profil de votre application par la suite.
La plupart du temps, la différence entre Linq et l'utilisation de boucles simples pour n'est pas du tout pertinente. L'amélioration de la maintenabilité de votre code devrait valoir quelques ms. Linq peut être plus lent car il fonctionne sur des énumérateurs qui sont implémentés comme des machines à états. Les boucles simples (...) seront donc plus rapides.
Je recommanderais de suivre les conseils de Lasse V. Karlsens et d'ajouter http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html à sa liste de liens.
Il n'y a aucune différence de performances entre les requêtes LINQ et les expressions Lambda.
Vous devez bien comprendre le fonctionnement de la fonction LINQ (les requêtes Lambda et LINQ) dans .Net avant de vous pencher sur les problèmes de performances.
Fondamentalement, vous pouvez travailler avec n'importe laquelle des requêtes LINQ et des expressions Lambda.
Requêtes LINQ
Il s'agit d'une requête lisible de haut niveau.
Il est converti en expressions Lambda équivalentes et expressions Lambda ajoutées en tant que nœuds dans une arborescence d'expressions. Arbre d'expression qui fait la structure des expressions lambda. Cela se fait par le compilateur.
Le fournisseur de requêtes examine les expressions (ajoutées en tant que nœuds dans l'arborescence des expressions) et produit des opérateurs de requête SQL égaux, donc une requête SQL équivalente formée pendant l'exécution.
Type de retour: jeu de résultats (IEnumerable).
Expressions Lambda
Il s'agit d'un ensemble d'expressions/instructions et crée une arborescence de délégués/expressions. Il peut être passé à une fonction comme argument.
Il prend en charge toutes les méthodes LINQ comme les requêtes LINQ. (Où, sélectionner, compter, additionner, etc.)
Un arbre d'expression formé qui structure les expressions lambda. Cela se fait par le compilateur.
Le fournisseur de requêtes examine les expressions (arborescence d'expressions) et produit une requête SQL équivalente pendant l'exécution.
Type de retour: Delagate/Expression Tree
Quel est le meilleur?
Vous pouvez comprendre le LINQ (requêtes, Lambda) si vous regardez dans les points ci-dessus.
Avantage de la requête LINQ - Elle est lisible.
Avantage de Lambda
Lambda aura un avantage car il crée un délégué et en utilisant le delagte, vous pouvez simplement passer les paramètres d'entrée et obtenir le résultat pour les différents paramètres d'entrée.Vous n'avez pas besoin d'écrire des requêtes différentes pour différents critères également.
Vous pouvez créer une requête dynamique à l'aide d'expressions Lambda et d'arbres d'expression.
Vous pouvez utiliser des expressions Lambda si vous souhaitez passer le résultat des instructions à une méthode comme argument.
les expressions sont plus courtes.
L'expression Lambda est donc la meilleure pour le développement par rapport aux requêtes LINQ.
Dans certains cas, LINQ est tout aussi rapide sinon plus rapide que d'autres méthodes, mais dans d'autres cas, il peut être plus lent. Nous travaillons sur un projet que nous avons converti en linq et la recherche de données est plus rapide mais la fusion des données entre deux tables est beaucoup plus lente. Il y a un peu de surcharge, mais dans la plupart des cas, je ne vois pas la différence de vitesse avoir beaucoup d'effet sur votre programme.