Lors de la construction d'expressions LINQ (pour moi, linq aux objets) il y a plusieurs façons d'accomplir quelque chose, certaines beaucoup, beaucoup mieux et plus efficace que d'autres.Quelle est la meilleure façon d'optimiser ou de "régler" les expressions LINQ?
- Existe-t-il un bon moyen de "régler" ou d'optimiser ces expressions?
- Quelles sont les métriques fondamentales utilisées par les gens et comment les rassemblez-vous?
- Existe-t-il un moyen d'obtenir le nombre "total d'itérations" ou une autre métrique, où vous pourriez "savoir" que les moyens inférieurs sont meilleurs?
EDIT
Merci Richard/Jon pour vos réponses. Ce que je veux vraiment, c'est un moyen d'obtenir un simple compte d'opérations "OCount" pour une expression LINQ bien que je ne suis pas sûr que les hooks existent dans LINQ pour le permettre. Supposons que j'ai un niveau de performance cible pour un matériel de machine spécifique (un SLA). Idéalement, j'ajouterais un test unitaire pour confirmer que les données typiques déplacées dans cette requête seraient traitées dans le temps imparti (à partir du SLA). Le problème est que ceci serait exécuté sur le serveur de construction/la machine de développement/etc. qui ressemble probablement peu au matériel de la machine du SLA. Donc l'idée est que je déterminerais un "OCount" max acceptable pour l'expression, sachant que si l'OCount est inférieur à X, il fournira certainement une performance acceptable sous le SLA sur le matériel "typique" cible. Si l'OCount dépasse ce seuil, le test build/unit génère un avertissement. Idéalement, je voudrais avoir quelque chose comme ça (pseudocode-ish):
var results = [big linq expression run against test dataset];
Assert.IsLess(MAXALLOWABLE_OCOUNT, results.OCount)
où results.OCount serait tout simplement me donner les itérations au total (n) nécessaires pour produire le jeu de résultats.
Pourquoi voudrais-je cela? Eh bien, même avec une expression LINQ de taille modérée, un petit changement/ajout peut avoir des effets ÉNORMES sur la performance en raison de l'augmentation du nombre total d'opérations. Le code d'application passerait toujours tous les tests unitaires car il produirait toujours le résultat correct, mais travaillerait misérablement lentement lorsqu'il est déployé.
L'autre raison est pour l'apprentissage simple. Si vous faites quelque chose et que le nombre monte ou descend d'un ordre de grandeur, alors vous apprenez quelque chose.
EDIT # 2 Je vais jeter dans une réponse potentielle aussi bien. Ce n'est pas le mien, ça vient de Cameron MacFarland d'une autre question que j'ai posée qui a engendré celle-ci. Il s'avère, je pense que la réponse à celui-ci pourrait fonctionner ici dans un environnement de test unitaire comme celui que j'ai décrit dans le premier edit de cette question. L'essentiel serait de créer les jeux de données de test dans l'unité de test unitaire que vous insérez dans l'expression LINQ de la manière décrite dans cette réponse, puis additionnez les comptes d'itération et comparez au nombre d'itérations maximum autorisé.