Devrait LINQ être évitée car elle est lente?
J'ai avait été dit que depuis .net, linq est si lent, nous ne devrions pas l'utiliser et je me demandais quelqu'un d'autre a venir avec la même conclusion, et l'exemple est:
A pris 1443ms faire 1000000000 compare non-LINQ.
Pris 4944ms faire 1000000000 compare avec LINQ.
(243% plus lent)
la non-LINQ code:
for (int i = 0; i < 10000; i++)
{
foreach (MyLinqTestClass1 item in lst1) //100000 items in the list
{
if (item.Name == "9999")
{
isInGroup = true;
break;
}
}
}
A pris 1443ms faire 1000000000 compare non-LINQ.
LINQ code:
for (int i = 0; i < 10000; i++)
isInGroup = lst1.Cast<MyLinqTestClass1>().Any(item => item.Name == "9999");
A pris 4944ms faire 1000000000 compare avec LINQ.
Je suppose que c'est possible d'optimiser le code LINQ mais l'idée était que le son facilement à être vraiment lent LINQ code et étant donné qu'il ne devrait pas être utilisé. Étant donné que LINQ est lent, puis il suivra aussi que PLINQ est lente et NHibernate LINQ serait lente de sorte que tout type sur LINQ déclaration ne doit pas être utilisé.
Quelqu'un d'autre a constaté que LINQ est si lent qu'ils voulaient qu'ils n'avaient jamais utilisé, ou ai-je fait une trop générale conclusion en se basant sur des critères comme cela?
- Essayez la restructuration de vos objets de sorte que vous n'avez pas besoin de la
cast
... - Je ne voudrais pas éviter de code, car il s'exécute seulement 250 millions de cycles par seconde au lieu de environ 750 millions de dollars, à moins que ce genre de débit est une véritable activité de cas. Aussi, les chances sont que les données proviennent de quelque chose qui est beaucoup plus lent que ce code de toute façon (une base de données, disque, ...). Allez pour ce qui semble le plus pratique et optimiser où il le faut.
- stackoverflow.com/questions/1185209/...
- Peut-être vous devriez être plus préoccupés que vous êtes inquiet au sujet de la prise de 3.5 nano-secondes de plus...
- Avec ce type de raisonnement, on devrait abandonner .NET parce que c'est lent. Aller à un natif langage compilé comme le C++. Oh, mais le C++ a des bibliothèques qui ne sont pas optimisés pour votre cas spécifique, afin de l'utiliser C sans bibliothèques. Et bien sûr, le compilateur fait des hypothèses (si le compilateur est souvent plus intelligent qu'un non-développeur chevronné), alors lisez sur l'assemblage et l'utilisation de ce lieu. Affaire au point, de nouvelles langues/caractéristiques de rendre la programmation plus facile et plus facile à gérer, mais généralement pas plus rapide. Préférez-vous un facile de lire le programme ou 3,5 nano-secondes plus rapide? Cela dépend de votre dossier d'affaires.
- En fonction de vos commentaires dans ce fil, il semble que vous êtes assez mis sur la non-utilisation de LINQ, malgré ce que les gens ont dit. Pas sûr de ce que votre but est -- en espérant pour confirmation, vous avez raison, au lieu de chercher ce qui est juste?
- Si votre code est couvert par les tests unitaires et vous n'avez finalement rencontrez un problème de performance avec LINQ code, vous pouvez changer de code de bas niveau comme nécessaire pour votre performance-sections critiques. Vous avez bénéficié de la expressif, code concis dans le court terme et la possibilité de le changer par la suite avec très peu de risques, mais uniquement si vous en avez besoin.
- ce n'est pas lié à des bases de données ou nhibernate à tous
- Pensez-y de cette façon: 243% ressemble beaucoup, mais si il fait la différence entre 1ms et 2.43 ms de temps de réponse lorsque l'utilisateur clique sur un bouton, vous pensez vraiment que c'est important? Vous avez à regarder les circonstances spécifiques avant de pouvoir tirer la moindre conclusion raisonnable à quel outil est l'outil idéal pour un travail donné.
- Dans ce cas, je préfère utiliser un dictionnaire, ou d'une liste avec une recherche binaire. Rien d'autre qu'une interaction au cours de milliers d'enregistrements. Toujours utiliser le bon outil pour le travail.
- Je actaully pense que l'idée de ne pas utiliser linq parce que d'un hasard de référence comme c'est fou mais je voulais juste voir si c'était juste moi et que je n'étais pas perdre mon esprit la pensée c'est ridicule de prendre des décisions basées sur un indice de référence.
- Eh bien, c'est bon à savoir au moins. Il suce quand vous n'avez pas de contrôle sur la situation, mais il ya seulement tellement que vous pouvez faire, en fonction de votre statut au sein de l'organisation.
- votre "Linq" code n'est pas vraiment une Linq exemple - c'est un for/next boucle avec Linq à l'intérieur. À essayer sans la For/Next.
- Voir aussi: stackoverflow.com/questions/1182922/...
- Un point mineur: lors de la déclaration d'une dégradation de la vitesse, il est difficile pour les gens de comprendre rapidement ce qu'est un pourcentage de plus que, disons, cinquante moyens. Il est facile de comprendre ce que "10% plus lent signifie" mais plutôt que de dire "243% plus lent", il est plus efficace de dire "plus de trois fois plus lent".
- en.wikipedia.org/wiki/Program_optimization - Il y a beaucoup de fronts pour lutter contre performance, mais le profilage est là que vous apprenez où ces fronts sont. LINQ permet d'économiser beaucoup de temps de développement pour moi et je n'ai pas encore l'optimiser pour une application d'entreprise. Pendant ce temps, artificielle de référence peuvent s'avèrent quasiment rien (surtout mal conçu repères que la défaite de les principaux avantages de LINQ).
- La raison de votre LINQ déclaration est plus lent est parce que vous êtes casting. .NET est le moulage de votre objet tout le chemin vers le bas pour objet de sauvegarder et de MyLinqTestClass1. C'est un très biaisée exemple. Ne pas utiliser de la fonte.
- comment est-ce subjectif/argumentatif? c'est une question valable.
- Ne devriez-vous pas être à l'aide de FirstOrDefault? Toute volonté de continuer à chercher tous les matchs au lieu de juste s'arrêter à la première.
Vous devez vous connecter pour publier un commentaire.
Pas. Il doit être évité si elle est pas assez rapide. Lent et pas assez rapide ne sont pas du tout la même chose!
Lent est pas pertinent pour vos clients, votre gestion et vos parties prenantes. Pas assez rapide est extrêmement pertinent. Ne jamais mesurer comment rapide quelque chose; qui vous dit rien que vous pouvez utiliser à la base d'une décision d'affaires sur. Mesure près d'être acceptable pour le client il est. Si elle est acceptable, alors arrêter de dépenser de l'argent sur le rendant plus rapide; c'est déjà bien assez.
L'optimisation de la Performance est cher. L'écriture de code de sorte qu'il peut être lu et entretenus par d'autres est cher. Ces objectifs sont souvent en opposition les uns aux autres, afin de passer vos parties prenantes de l'argent de façon responsable, vous avez pour vous assurer que vous êtes seulement un temps précieux et d'efforts à faire de l'optimisation des performances sur des choses qui sont pas assez rapide.
Vous avez trouvé une artificielle, irréaliste de référence situation où LINQ code est plus lent que sur une autre façon d'écrire le code. Je vous assure que vos clients de soins n'est pas un peu sur la vitesse de votre irréaliste de référence. Ils ont en charge uniquement si le programme que vous êtes de livraison est trop lent pour eux. Et je vous assure, la gestion de votre soucis n'est pas un peu à ce sujet (si elles sont compétentes); ils se soucient de savoir combien d'argent vous serez en mesure de dépenser inutilement de faire des trucs qui est assez rapide unnoticably plus rapide, et de rendre le code plus cher de lire, de comprendre, et de maintenir dans le processus.
Join
opération. Avec LINQ, vous allez écrire plus expressif code et vous permettra d'écrire plus vite. Et il va effectuer, trop.Pourquoi êtes-vous à l'aide de
Cast<T>()
? Vous n'avez pas donné assez de code pour vraiment juger de l'indice de référence, en gros.Oui, vous peut utiliser LINQ pour écrire lente code. Devinez quoi? Vous pouvez écrire lent non-LINQ code, trop.
LINQ grandement sida expressivité du code portant sur les données... et il n'est pas difficile d'écrire du code qui fonctionne bien, aussi longtemps que vous prenez le temps de comprendre LINQ pour commencer.
Si quelqu'un dit moi de ne pas utiliser LINQ (surtout LINQ to Objects) pour perçu des raisons de vitesse je ris dans leur visage. Si ils sont venus avec un goulot d'étranglement et a dit, "Nous pouvons rendre cela plus rapidement par la non-utilisation de LINQ dans cette situation, et en voici la preuve", alors que c'est une toute autre affaire.
lst1
unArraylist
, par hasard? (Pourrait expliquer laCast<>
)foreach
boucles parce qu'ils sont plus lents quefor
boucles, j'ai besoin d'unfor
boucle avec les transactions de base (rupture de la boucle si la collecte des changements)"Peut-être que j'ai manqué quelque chose, mais je suis sûr que tes repères sont éteints.
J'ai testé avec les méthodes suivantes:
Any
méthode d'extension ("LINQ")foreach
boucle (votre "optimisé" de la méthode)ICollection.Contains
méthodeAny
méthode d'extension à l'aide d'une optimisation de structure de données (HashSet<T>
)Voici le code de test:
Ne vous inquiétez pas sur le fonctionnement interne de la
Profiler
classe. Il fonctionne juste l'Action
dans une boucle et utilise unStopwatch
pour le moment. Elle fait également en sorte d'appelerGC.Collect()
avant chaque test afin d'éliminer autant de bruit que possible.Voici les résultats:
Les données est très cohérent et raconte l'histoire suivante:
Naïvement à l'aide de la
Any
méthode d'extension est d'environ 9% plus lent que naïvement à l'aide d'unforeach
boucle.À l'aide de la méthode la plus appropriée (
ICollection<string>.Contains
) avec un unoptimized structure de données (List<string>
) est d'environ 50% plus rapide que naïvement à l'aide d'unforeach
boucle.À l'aide d'une optimisation de structure de données (
HashSet<string>
) souffle complètement l'une des méthodes hors de l'eau en termes de performances.Je n'ai aucune idée de l'endroit où vous avez obtenu 243% de. Ma conjecture est qu'il a quelque chose à faire avec tout ce casting. Si vous utilisez un
ArrayList
alors non seulement vous à l'aide d'un unoptimized structure de données, vous êtes en utilisant une grande partie obsolètes structure de données.Je peux prévoir ce qui vient ensuite. "Ouais, je sais que vous pouvez l'optimiser un peu mieux, mais c'était juste un exemple pour comparer la performance de LINQ vs non-LINQ."
Ouais, mais si vous ne pouvait pas encore être approfondie dans votre exemple, comment peut-on s'attendre à l'être approfondie dans le code de production?
La ligne de fond est: est-ce
Si vous exécutez dans les goulets d'étranglement de performance - qui est tout aussi susceptible de se produire avec LINQ vs sans - puis à les résoudre. Eric suggestion de traitement automatisé de tests de performance est excellente; qui va vous aider à identifier les problèmes précoce de sorte que vous pouvez les résoudre correctement - pas en fuyant un outil étonnant qui vous fait 80% plus productif, mais il arrive à subir une < 10% de la performance, mais en fait enquêter sur la question et à venir avec une vraie solution qui peuvent booster vos performances par un facteur de 2, ou 10, ou 100 ou plus.
De créer des applications de haute performance n'est pas à propos de l'utilisation du droit de bibliothèques. C'est à propos de de profilage, à faire de bons choix de conception, et la rédaction d'un bon code.
TRACE
drapeau off, donc pas de frais généraux est d'être engagés pour cette épreuve.LINQ est un véritable goulot d'étranglement (soit effectuer l'ensemble ou de la performance perçue de la demande)?
Sera votre application effectue cette opération sur 1 000 000 000 d'+ enregistrements dans le monde réel? Si oui, alors vous pourriez envisager des solutions de rechange--si non, alors c'est comme dire "on ne peut pas acheter cette berline familiale car elle permet de ne pas conduire à 180+ MPH".
Si c'est "juste lent", alors ce n'est pas une très bonne raison... par ce raisonnement, vous devriez être en écrivant tout en asm/C/C++ et C# doit être hors de la table pour être "trop lent".
Tout prématurée pessimization est (à mon humble avis) aussi mauvais que l'optimisation prématurée, vous ne devriez pas écarter toute une technologie basée sur la vitesse absolue, sans prendre d'utilisation en considération. Oui, si vous êtes en train de faire quelques très lourd arithmétique et c'est un goulot d'étranglement, LINQ pourrait être problématique - profil.
Un argument que vous pourriez utiliser en faveur de LINQ, c'est que, tandis que vous pouvez probablement surpasser avec manuscrites code, le LINQ version pourrait être plus clair et plus facile à maintenir - en plus, il y a l'avantage de PLINQ par rapport à manuel complexe de parallélisation.
Le problème avec ce genre de comparaison, c'est que son sens dans l'abstrait.
On pourrait battre un de ces si on est arrivé à commencer par le hachage de l'MyLinqTestClass1 les objets par leur Nom de la propriété. Entre ceux si on peut les trier par Nom et, plus tard, faire une recherche binaire. En effet, nous n'avons pas besoin de stocker les MyLinqTestClass1 objets pour cela, nous avons juste besoin de stocker les noms.
La taille de la mémoire d'un problème? Peut-être stocker les noms dans un DAWG structure, combiner suffit et ensuite l'utiliser pour cette case?
Fait les frais généraux supplémentaires dans la définition de ces structures de données jusqu'aucun sens? Il est impossible de le dire.
Une autre question est un autre problème avec le concept de LINQ, qui est son nom. Il est idéal pour des fins de marketing pour MS à être en mesure de dire "voici un bouquet de fraîcheur, de nouveaux trucs qui travaille ensemble", mais moins bon quand il s'agit de personnes combinant des trucs ensemble quand ils sont en train de faire le tri de l'analyse où ils devraient être, les écartant. Vous avez un appel à
Any
que, fondamentalement, met en œuvre le filtre-sur-énumérable motif commun dans .NET2.0 jours (et pas inconnu .NET1.1 bien qu'il soit plus difficile à écrire signifiait qu'il n'a été utilisé que lorsque ses avantages d'efficacité, dans certains cas, a vraiment de l'importance), vous avez les expressions lambda et vous avez requête arbres bondonnés ensemble dans un seul concept. Qui est le lent?Je parie que la réponse est ici le lambda et non pas de l'utilisation de
Any
, mais je n'aurais pas parié une grande quantité (par exemple, la réussite d'un projet), j'aimerais tester et d'en être sûr. Pendant ce temps, la façon dont les expressions lambda travailler avec IQueryable peut rendre particulièrement efficace, le code qu'il serait extrêmement difficile d'écrire avec une efficacité équivalente, sans l'utilisation de lambdas.N'avons-nous pas arriver à être efficace quand LINQ est bon à l'efficacité, car il a échoué artificielle de référence? Je ne le pense pas.
Utiliser LINQ où il fait sens.
Dans le goulot d'étranglement conditions, puis éloigner ou à LINQ malgré elle semblant approprié ou inapproprié d'une optimisation. N'écrivez pas difficile à comprendre du premier code d'y aller, car vous aurez juste à faire de l'optimisation réelle plus difficile.
Peut-être linq est lent, mais avec linq je peut paralléliser mon code très simple.
Comme ceci:
Comment vous paralléliser cycle?
Pour moi, cela sonne comme vous travaillez sur un contrat et l'employeur ne comprends pas LINQ, ou ne pas comprendre les goulots d'étranglement des performances du système. Si vous écrivez une application avec une interface graphique, le mineur impact sur les performances de l'utilisation de LINQ est négligeable. Dans un typique/l'interface utilisateur graphique Web app, en mémoire des appels représentent moins de 1% de tous les temps d'attente. Vous, ou plutôt votre employeur, est d'essayer d'optimiser ce 1%. Est-ce vraiment bénéfique?
Toutefois, si vous écrivez une application qui est scientifique ou fortement en mathématiques orientées, avec très peu de disque ou accès de base de données, alors je serai d'accord que LINQ n'est pas la voie à suivre.
BTW, le casting n'est pas nécessaire. Ce qui suit est fonctionnellement équivalent à votre premier test:
Quand j'ai couru ce à l'aide d'une liste de test contenant 10 000 MyLinqTestClass1 objets, l'original a couru dans 2.79 secondes, la version révisée en 3.43 secondes. Économie de 30% sur les opérations de probablement moins de 1% de temps CPU n'est pas une bonne utilisation de votre temps.
Voici une observation intéressante, puisque vous parlez de nHibernate est lent comme une conséquence de LINQ d'être lent. Si vous êtes en train de faire LINQ to SQL (ou nHibernate équivalent), puis votre code LINQ se traduit par une EXISTE requête sur le serveur SQL server où en tant que votre boucle de code doit d'abord récupérer toutes les lignes, puis itérer sur eux. Maintenant, vous pouvez facilement écrire un tel test, de sorte que la boucle de code lit toutes les données à la fois (un seul DB de recherche) pour tous les 10K s'exécute, mais le code LINQ effectue 10K de requêtes SQL. Il va probablement afficher un grand avantage en termes de vitesse de la boucle de version qui n'existe pas dans la réalité. En réalité, un seul EXISTE requête est en passe de dépasser l'analyse de la table et de la boucle à chaque fois, même si vous ne disposez pas d'un index sur la colonne qui est interrogé (qui vous serait probablement si cette requête est fait très souvent).
Je ne dis pas que c'est le cas avec votre test, nous n'avons pas assez de code pour voir, mais il pourrait l'être. Il se pourrait aussi que il y a vraiment une différence de performance avec LINQ to Objects, mais qui ne peut pas se traduire à LINQ to SQL à tous. Vous devez savoir ce que vous êtes en mesure et comment elle est applicable à votre monde réel besoin.
"J'ai dit [par qui?] que depuis .net, linq est tellement lent [quoi?] nous ne devrions pas l'utiliser"
Dans mon expérience, le fait de baser les décisions comme quoi la technique, de la bibliothèque ou de la langue à utiliser uniquement sur ce qui quelqu'un a une fois vous a dit est une mauvaise idée.
Tout d'abord, les informations proviennent d'une source de confiance? Si pas, vous pourriez faire une énorme erreur de faire confiance à cette (peut-être inconnu) personne pour prendre vos décisions de conception. Deuxièmement, cette information est-elle encore pertinente aujourd'hui? Mais bon, basé sur votre simple et pas très réaliste de référence, vous avez conclu que LINQ est plus lent que l'exécution manuelle de la même opération. La question à poser est celle-ci: est-ce code critique pour les performances? La performance de ce code, être limitée par autres facteurs que la vitesse d'exécution de ma requête LINQ-pensez requêtes de base de données, en attente sur I/O, etc?
Voici la façon dont j'aime le travail:
Pour moi, cette méthode simple sert un seul but: maximiser ma productivité par minimiser le temps que je passe l'amélioration de code qui est déjà parfaitement adéquate.
Oui, le jour pourrait venir quand vous trouvez que votre solution originale n'a pas le couper plus. Ou il ne pourrait pas. Si elle le fait, traiter avec elle, puis et là. Je vous suggère d'éviter de gaspiller votre temps à essayer de résoudre hypothétique (future) des problèmes.
foreach
plutôt que d'un LINQ déclaration alors pourquoi ne pas utiliser [laforeach
énoncé] et de ne pas prendre le risque [...]?" - ma raison de ne pas utiliser leforeach
déclaration, c'est que le risque d'un problème de performance est extrêmement petites par rapport aux risques qu'un bug finira par être mis en oeuvre en raison maladroitement écrit du code impératif. Il est facile d'écrire un programme rapide qui ne fonctionne pas. Il est également plus difficile à corriger les fast-mais-mauvais programme qu'il est d'accélérer la lente mais correcte d'un programme.Oui, vous avez raison. Il est facile d'écrire lente code dans LINQ. Les autres sont à droite, trop: il est facile d'écrire lente code en C# sans LINQ.
J'ai écrit la même boucle que vous en C et il a couru pendant un certain nombre de millisecondes plus rapide. La conclusion que je tire de cette est que C# lui-même est lent.
Comme avec votre LINQ->boucle d'expansion, en C il va prendre plus de 5 fois plus de lignes de code pour faire la même chose, le rendant plus lent à écrire, plus difficile à lire, plus susceptibles d'avoir des bugs, et plus difficile à trouver et les corriger, mais si l'enregistrement de quelques millisecondes pour chaque milliard de dollars d'itérations est important, c'est souvent ce qu'il faut.
Comme vous l'a démontré, il est possible d'écrire des non-LINQ code qui fonctionne mieux que LINQ code. Mais l'inverse est également possible. Compte tenu de la maintenance de l'avantage que LINQ peut fournir, vous pourriez envisager de défaut LINQ comme il est peu probable que vous allez courir dans toutes les goulots d'étranglement des performances qui peuvent être attribués à LINQ.
Cela dit, il y a quelques scénarios où LINQ juste ne fonctionnera pas. Par exemple, si vous importez une tonne de données, vous trouverez peut-être que la loi de l'exécution d'un individu insère est plus lent que d'envoyer les données vers SQL Server dans des lots de XML. Dans cet exemple, ce n'est pas que le LINQ insertion est plus rapide que les non-LINQ insérer, c'est plutôt pas prodent pour exécuter des SQL insert pour un volume d'importations de données.
Je dirais plutôt que vous devriez éviter d'essayer trop dur d'écrire le plus efficace du code, à l'exception, c'est obligatoire.
C'est une Façon contexte différent, mais incroyablement différent. Un 1.4 vs 5 secondes pour l'ensemble de 1 milliard d'opérations ne sont pas pertinents lorsque vous parlez des opérations d'accès aux données.
Votre cas de test est un peu biaisé. Le TOUT opérateur va commencer l'énumération par le biais de vos résultats et de les retourner true en cas de première instance si trouve et cesser de fumer. Essayez cela avec de simples listes de chaînes pour voir le résultat. Pour répondre à votre question sur la façon d'éviter LINQ, vous devriez vraiment la transition vers l'utilisation de LINQ. Il rend le code plus facile à lire quand vous faites des requêtes complexes en plus de compiler le temps de vérifier. Aussi, vous n'avez pas besoin d'utiliser l'opérateur de Cast dans votre exemple.
Le type coulée est bien sûr va ralentir votre code vers le bas. Si vous vous souciez de cela, au moins utilisé une fortement typé IEnumerable pour la comparaison. J'ai moi-même essayer d'utiliser LINQ dans la mesure du possible. Il rend votre code plus concis. Ce n'est pas de ne pas avoir à vous soucier de l'impératif détails de votre code. LINQ est une notion fonctionnelle qui signifie que vous vous préciser ce que vous voulez arriver et ne pas vous soucier de comment.
Il y a mille fois plus de raisons pour éviter de Linq.
Citation suivante à partir d'une discussion sur Linq noms de quelques-uns d'entre eux:
QUOTE1
"Par exemple cela fonctionne:
Mais cela ne fonctionne pas:
Il retourne :
Error 1 Cannot implicitly convert type 'AnonymousType#1' to 'AnonymousType#2'
Mais cela fonctionne:
Lors de la compilation:
Le type de composants x et y est arbitrairement déclaré comme un entier signé de 32 bits, et il est l'un des nombreux types integer de la plate-forme, sans rien de spécial.
Mais il n'y est plus. Par exemple cela fonctionne:
Mais cela ne fonctionne pas:
La conversion numérique règles ne sont pas applicables à ce genre de types. Comme vous pouvez le voir, l'élégance est dans chaque détail."
QUOTE2
"Il semble, alors, que" AnonymousType#1 " et "AnonymousType#2" ne sont pas synonymes-ils le nom de types distincts. Et comme
{ x = 1, y = 2 }
et{ y = 2, x = 1 }
sont les expressions de ces deux types, respectivement, non seulement ils dénotent des valeurs distinctes, mais aussi des valeurs de types distincts.Ce qui m'a le droit d'être paranoïaque. Maintenant, ma paranoïa s'étend encore plus loin et j'ai demander à ce que LinQ fait la comparaison suivante:
Le résultat est faux parce que c'est un pointeur de comparaison.
Mais le résultat de:
Est vrai.
Et le résultat de:
et
Est faux."
QUOTE3
"mises à jour d'enregistrement sont orientées vers :-O
Cela, je suis d'accord, est problématique, et la dérive de LINQ séquence tournée vers la nature.
C'est un frein pour moi. Si je dois utiliser SQL pour mes mises à jour de toute façon, pourquoi se préoccuper de LinQ?
l'optimisation de LinQ to objects est unexistent.
Il n'est pas algébrique d'optimisation, ni automatique expression de réécriture. Beaucoup de gens ne veulent pas utiliser LinQ to Objects, car ils perdent beaucoup de performance. Les requêtes sont exécutées de la même manière que vous les écrivez."