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.

InformationsquelleAutor user455095 | 2010-09-22