38 votes

Quelle est l’efficacité et la performance de LINQ et de l’expression Lambda dans .Net?

J'ai utilisé .Net 3.5 et visual studio 2008 pour plus d'un mois. Comme la plupart .Net développeurs, j'ai évolué à partir des années d'expérience dans le domaine .Net 1.0 & 2.0 et VS 2005. Tout récemment, j'ai découvert la simplicité et la puissance de LINQ et les Expressions Lambda, comme dans mes dernières questions telles que Trouver un élément dans la liste par LINQ, de Convertir ou d'une carte à une instance de classe à une liste d'une autre par l'utilisation de Lambda ou LINQ, et de Convertir ou de la carte d'une liste de classe à une autre liste de classe à l'aide de Lambda ou LINQ.

J'avoue que la Lambda et LINQ sont beaucoup plus simple et facile à lire, et ils semblent très puissant. Derrière les coulisses, l' .Net compilateur doit générer beaucoup de code pour réaliser ces fonctions. Donc je suis un peu peu hésité à passer à la nouvelle syntaxe car je connais déjà le "vieux" de façon à obtenir les mêmes résultats.

Ma question est au sujet de la performance et l'efficacité de la Lambda et LINQ. Peut-être les expressions Lambda sont pour la plupart en ligne, qui, dans ce cas, je suppose que Lambda devrait être correct. Comment LINQ?

Nous allons limiter le débat à LINQ-to-Objets LINQ-to-SQL (LINQ-to-SQL). Toute observation, de comparaison et d'expériences?

34voto

Lasse V. Karlsen Points 148037

Il n'y a pas une réponse unique 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 à chaque pièce de la technologie au bout des doigts, LINQ peuvent être maltraités et abusés, et la capacité de distinguer entre, d'une utilisation correcte et, ne dépend que d'une chose: la connaissance.

Donc le meilleur conseil que je puisse vous donner est d'aller lire sur comment LINQ est vraiment mis en œuvre.

Choses que vous devez vérifier sont:

Et comme toujours, lorsque l'on examine des questions d'efficacité, la seule approche sécuritaire est juste à mesurer. Créer un morceau de code à l'aide de LINQ qui ne un seul, à savoir, la chose, et de créer une alternative, puis de mesurer à la fois, et essayer de l'améliorer. Deviner et en supposant que ne fera que conduire à de mauvais résultats.

6voto

George Mauer Points 22685

Techniquement, le moyen le plus rapide est de contrôler toutes les règles vous-même. Voici quelques tests de performance. Notez que le mot-clé foreach et le ForEach LINQ construire de même beaucoup beaucoup plus que juste de l'aide et de l'écriture du code de procédure.

Cependant, le compilateur peut et sera améliorée et vous pouvez toujours le profil de votre code et d'optimiser toutes les zones à problèmes. Il est généralement recommandé d'utiliser le plus expressif des caractéristiques qui rendent le code plus facile à lire, sauf si vous avez vraiment besoin de l'appoint de nanosecondes.

5voto

Michael Morton Points 2786

Pour les requêtes LINQ, avec la "nouvelle syntaxe", l'IL (code) généré n'est fondamentalement pas différent de l'appel des méthodes d'extension fournies directement par Enumerable et Queryable.

3voto

sbreitzke Points 41

Ne pas optimiser prématurément. L'utilisation de Linq et les nouvelles méthodes d'extension généreusement si elles améliorent la lisibilité et le profil de votre demande par la suite.

La plupart du temps la différence entre Linq et à l'aide de la plaine des boucles n'est pas pertinent du tout. L'amélioration de la maintenabilité de votre code doit être une valeur de quelques ms. Linq peut être plus lent, car il fonctionne sur les agents recenseurs qui sont mis en œuvre comme des machines à états. Donc, la plaine(...) les boucles seront plus rapides.

Je recommande suivantes Lasse V. Karlsens des conseils et de l'ajouter http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html à son liste de liens.

2voto

Balaji Umapathy Points 39

Il n'y a pas de différence de performances entre les requêtes LINQ et les expressions Lambda.

Vous devez comprendre complètement comment LINQ fonction(à la fois Lambda, les requêtes LINQ) travaille en .Net avant de vous sont à la recherche des problèmes de performance.

Fondamentalement, vous pouvez travailler avec n'importe quel un seul de ces deux requêtes LINQ et les expressions Lambda..

Les Requêtes LINQ

  1. Il est de haut niveau lisible de la requête.

  2. Il est converti en equalent Lambda les expressions et les expressions Lambda ajoutés comme des nœuds dans l'arborescence d'expression. L'Expression de l'arbre ce qui rend la structure des expressions lambda. C'est fait par le compilateur.

  3. Requête fournisseur de recherche dans les expressions(ajouté sous forme de nœuds dans l'arborescence d'expression) et produit equalent requête SQL ainsi les opérateurs equalent requête sql formé au cours de moment de l'exécution.

  4. Le Type de retour : ensemble de résultats (IEnumerable).

Les Expressions Lambda

  1. C'est un ensemble d'expressions/déclarations et crée délégué / l'expression de l'arbre. Il peut être transmis à une fonction comme argument.

  2. Il prend en charge toutes les méthodes LINQ comme les requêtes LINQ. (Où,de Sélectionner,Count,Sum,etc)

  3. Une arborescence d'expression formée qui fait de la structure de lambda les expressions. Ceci est fait par compilateur.

  4. Requête fournisseur de recherche dans les expressions(expression de l'arbre) et produit equalent requête SQL au cours de moment de l'exécution.

  5. Le Type De Retour : Delagate / L'Expression De L'Arbre

Qui est le Meilleur?

Vous pouvez comprendre le LINQ (Requêtes,Lambda) Si vous regardez dans les points ci-dessus.

L'avantage de requête LINQ - Elle est lisible.

L'avantage de Lambda

  1. Lambda aura un avantage, car il crée un délégué et par l'utilisation de le delagte vous pouvez simplement transmettre le d'entrée de paramètres à utiliser et obtenir le résultat pour les différents entrée les paramètres.Vous avez besoin d'écrire requêtes différentes pour les différents les critères d'.

  2. Vous pouvez créer des dynamiques de la requête par en utilisant les expressions Lambda et Des arbres d'Expression.

  3. Vous pouvez utiliser des expressions Lambda si vous souhaitez transmettre le résultat de déclaration(s) à une méthode comme une argument.

  4. les expressions sont plus courts.

Donc, expression Lambda est la meilleure pour le développement sur les requêtes LINQ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X