Linq, comme un construit-dans la technologie, a des performances des avantages et des inconvénients. Le code de l'extension des méthodes considérablement la performance de l'attention portée par les .NET de l'équipe et de sa capacité à fournir une évaluation différée signifie que le coût de réalisation de la plupart des manipulations sur un ensemble d'objets est répandu à travers le plus grand algorithme nécessitant les manipulés ensemble. Cependant, il ya certaines choses que vous devez savoir qui peut faire ou défaire votre code de la performance.
D'abord et avant tout, Linq n'est pas comme par magie enregistrer votre programme de la mémoire et de temps nécessaire pour effectuer une opération; simplement, il peut retarder ces opérations jusqu'à ce absolument nécessaire. OrderBy() effectue un tri rapide, qui prendra nlogn le temps la même façon que si vous aviez écrit votre propre QuickSorter ou de la Liste utilisée.Sort() au bon moment. Donc, toujours être conscient de ce que vous demandez Linq à faire à une série lors de l'écriture de requêtes; si une manipulation n'est pas nécessaire, envisager la restructuration de la requête ou de la méthode de la chaîne de l'éviter.
De même, certaines opérations (tri, de regroupement, agrégats) nécessite la connaissance de l'ensemble qu'ils s'y conforment. Le dernier élément dans une série qui pourrait être la première, l'opération doit renvoyer à partir de son itérateur. En plus de cela, parce que Linq opérations ne devraient pas modifier leur source énumérable, mais la plupart des algorithmes qu'ils utilisent (c'est à dire en place toutes sortes), ces opérations de fin non seulement à évaluer, mais la copie de l'ensemble énumérable en béton, finis de la structure, l'exécution de l'opération, et céder à travers elle. Donc, lorsque vous utilisez OrderBy() dans une déclaration, et vous demandez à un élément dans le résultat final, TOUT ce que l'interface IEnumerable donné qu'il peut produire est évaluée, stockées dans la mémoire comme un tableau, triés, puis est retourné un élément à la fois. La morale est, toute opération qui a besoin d'un ensemble fini au lieu d'une énumération doit être placé le plus en retard dans la requête que possible, en permettant à d'autres opérations comme l'endroit Où() et Sélectionnez() afin de réduire la cardinalité et la mémoire de l'empreinte de la source.
Enfin, les méthodes Linq augmenter considérablement la taille de la pile d'appel et de la mémoire de votre système. Chaque opération qui doit connaître de l'ensemble conserve toute source fixés dans la mémoire jusqu'à ce que le dernier élément a été réaffirmé, et l'évaluation de chaque élément impliquera une pile d'appel au moins deux fois plus profond que le nombre de méthodes dans votre chaîne ou des clauses de votre inline déclaration (un appel à chaque itérateur est MoveNext() ou rendement GetEnumerator, plus au moins un appel à chaque lambda le long du chemin). C'est tout simplement le résultat dans un plus grand, plus lent qu'un algorithme intelligemment conçu inline algorithme qui effectue les mêmes manipulations. Linq est le principal avantage est la simplicité du code. La création, puis le tri, un dictionnaire des listes de groupes de valeurs n'est pas très facile à comprendre le code (croyez-moi). Micro-optimisations peuvent obscurcir davantage. Si la performance est votre préoccupation principale, puis ne pas utiliser Linq; il va ajouter environ 10% de surcharge de temps et plusieurs fois la surcharge de la mémoire de la manipulation d'une liste sur place vous-même. Cependant, la facilité de maintenance est généralement la principale préoccupation des développeurs, et Linq aide vraiment là.
Sur le coup de pied de performance: Si les performances de votre algorithme est le sacré, uncompromisable première priorité, vous seriez de programmation dans un langage non managé comme C++; .NET va être beaucoup plus lent juste en vertu de celui-ci étant géré de l'environnement d'exécution, avec JIT compilation native, la mémoire gérée et extra threads du système. Je voudrais adopter une philosophie de l'être "assez bon"; Linq peut introduire des ralentissements, de par sa nature, mais si vous ne pouvez pas faire la différence, et votre client ne peut pas faire la différence, alors, à toutes fins pratiques, il n'y a pas de différence. "L'optimisation prématurée est la racine de tout mal"; le Faire fonctionner, PUIS chercher les occasions de le rendre plus performant, jusqu'à ce que vous et votre client d'accord que c'est assez bon. Il pourrait toujours être "mieux", mais si vous voulez être de la main-d'emballage code machine, vous trouverez un point de moins qu'au cours de laquelle vous pouvez déclarer la victoire et se déplacer.