J'écris un gestionnaire de rendu de maillage et j'ai pensé que ce serait une bonne idée de regrouper tous les maillages qui utilisent le même shader, puis de les rendre pendant que je suis dans cette passe de shader.
J'utilise actuellement une foreach
boucle, mais je me suis demandé si l'utilisation de LINQ pouvait me permettre d'augmenter les performances?
c#
performance
linq
foreach
Neil Knight
la source
la source
Réponses:
Pourquoi LINQ devrait-il être plus rapide? Il utilise également des boucles en interne.
La plupart du temps, LINQ sera un peu plus lent car il introduit une surcharge. N'utilisez pas LINQ si vous vous souciez beaucoup des performances. Utilisez LINQ car vous voulez un code plus court, mieux lisible et maintenable.
la source
LINQ-to-Objects va généralement ajouter des frais généraux marginaux (itérateurs multiples, etc.). Il doit encore faire les boucles, et a délégué invoque, et devra généralement faire un peu plus pour obtenir le déréférencement à des variables capturées , etc. Dans la plupart des codes ce sera pratiquement indétectable, et plus offert par le plus simple à comprendre le code.
Avec d'autres fournisseurs LINQ comme LINQ-to-SQL, puisque la requête peut filtrer sur le serveur, elle devrait être bien meilleure qu'un flat
foreach
, mais vous n'auriez probablement pas fait une couverture de"select * from foo"
toute façon , donc ce n'est pas nécessairement juste Comparaison.Re PLINQ; le parallélisme peut réduire le temps écoulé , mais le temps CPU total augmentera généralement un peu en raison des frais généraux de la gestion des threads, etc.
la source
List<Foo>
; à la place, je devrais utiliser unforeach
bloc sur ces collections. La recommandation à utiliserforeach
dans ces contextes a du sens. Ma préoccupation: dois-je remplacer les requêtes LINQ par uniquementforeach
si je détecte un problème de performances? À l'avenir, je considérerai leforeach
premier.Je pense que LINQ est préférable d'utiliser sur une
foreach
boucle, car il vous donne un code beaucoup plus propre et facile à comprendre. Mais LINQ est plus lent queforeach
. Pour en savoir plus, consultez l'article LINQ vs FOREACH vs FOR Loop Performance .la source
LINQ est plus lent maintenant, mais il pourrait devenir plus rapide à un moment donné. L'avantage de LINQ est que vous n'avez pas à vous soucier de son fonctionnement. Si une nouvelle méthode est imaginée et incroyablement rapide, les gens de Microsoft peuvent l'implémenter sans même vous le dire et votre code serait beaucoup plus rapide.
Plus important encore, LINQ est simplement beaucoup plus facile à lire. Cela devrait être une raison suffisante.
la source
Il faut probablement noter que la
for
boucle est plus rapide que leforeach
. Donc, pour le message d'origine, si vous vous inquiétez des performances sur un composant critique comme un moteur de rendu, utilisez unefor
boucle.Référence: Dans .NET, quelle boucle s'exécute plus rapidement, «for» ou «foreach»?
la source
Vous pouvez obtenir une amélioration des performances si vous utilisez LINQ parallèle pour plusieurs cœurs. Voir Parallel LINQ (PLINQ) (MSDN).
la source
J'étais intéressé par cette question, alors j'ai fait un test tout à l'heure. Utilisation de .NET Framework 4.5.2 sur un processeur Intel (R) Core (TM) i3-2328M à 2,20 GHz, 2200 Mhz, 2 cœurs avec 8 Go de RAM exécutant Microsoft Windows 7 Ultimate.
Il semble que LINQ soit plus rapide que pour chaque boucle. Voici les résultats que j'ai obtenus:
Il serait intéressant que certains d'entre vous puissent copier et coller ce code dans une application console et le tester également. Avant de tester avec un objet (Employee), j'ai essayé le même test avec des entiers. LINQ y était également plus rapide.
la source
Exists=True Time=184 Exists=True Time=135
sur un ordinateur portable Apache Gaming (Win 10, C # 7.3). Compilé et exécuté en mode débogage. Si j'inverse les tests, j'obtiensExists=True Time=158 Exists=True Time=194
. Il semble que Linq soit plus optimisé, je suppose.C'est en fait une question assez complexe. Linq rend certaines choses très faciles à faire, que si vous les implémentez vous-même, vous pourriez trébucher (par exemple, linq .Except ()). Ceci s'applique en particulier à PLinq, et en particulier à l'agrégation parallèle implémentée par PLinq.
En général, pour un code identique, linq sera plus lent, en raison de la surcharge de l'appel de délégué.
Si, cependant, vous traitez un large éventail de données et appliquez des calculs relativement simples aux éléments, vous obtiendrez une augmentation considérable des performances si:
Vous utilisez une boucle for pour accéder à chaque élément (par opposition à foreach ou linq).
la source