Je suis beaucoup pogmatère avec un cadre d'entité, des collections et une utilisation aussi des conditions et de l'ordre par actions. Je me suis demandé cela pendant un moment, mais n'a jamais été capable de le comprendre.
Disons que j'ai le suivi de deux morceaux de code; p>
Le premier exemple en premier fait une commande Sur les RESCHESTES, puis itire sur la collection où la seconde a la commande en ce moment, nous allons itérer sur elle. Maintenant, la vraie question que je me demandais un moment où .. Quelle est la différence de performance (s'il y en a une)? Et est l'une des deux méthodes mieux que l'autre? Identique avec les condensateurs (simples et complexes avec des jointures), y a-t-il une différence notable? P> p>
3 Réponses :
La seule différence que je peux voir, c'est que dans le premier code, le itérateur code> créé (non exécuté) avant
foreach code> et que vous le stockez dans une variable locale. Code
foreach code> appelle la méthode
getenumarator code> sur l'itérateur directement plutôt que la variable locale. Mais bien sûr, cela ne fera aucune différence concernant la performance.Aside à partir de cela, je préférerais le second à cause de la lisibilité. P>
Votre première requête est équivalente à et votre deuxième requête est p> Les deux requêtes sont presque identiques, seule la première requête A un En outre, votre première instruction n'exécute pas une requête. Conclusion: la différence de performance Sera si petite que vous devrez essayer très fort de taper toutes les différences réelles. Bien sûr, c'est ma femme humble. P> p> supplémentaire (...) (...) code> appeler où vous sélectionnez l'entrée donnée, il est donc assez inutile. Le compilateur C # peut supprimer l'appel, mais vous devrez regarder l'IL généré pour savoir que. P>
.Orderby (...) code> et la plupart des instructions Linq sont des définitions de requêtes. Cela signifie que votre appel à
.orderby (...) code> n'exécute pas réellement, sa une question qui n'est pas répondue avant votre itérate sur les résultats em>. Donc, dans vos deux versions, les requêtes sont exécutées lorsque le
foreach (... dans
"La première requête a un appel supplémentaire. opposé à vb.net).
@Timschmelter correct. Je ne suggère pas de supprimer le SELECT .. CODE> dans la syntaxe de requête, je souligne seulement qu'il ne fait rien d'utile d'un point de vue fonctionnel.
Il n'y a pas de différence entre les deux ..
code - p> code généré - p> Edit: strong>
Voici une variation intéressante que j'étais tentée d'essayer .. Dans la case ci-dessus, pour l'expression de la requête, le compilateur était suffisamment intelligent pour optimiser le code - p> code généré - p> Sélectionnez CODE>. Mais si, sur la deuxième variation, nous plaçons sur un
explicite sur code>. C'était un peu surprenant, mais toujours, le compilateur n'a pas optimiser le
explicite code> (vs explicite
Sélectionnez code> dans l'expression de requête - une exigence par compilateur). p>
@Tall, merci pour toutes les réponses! La question est bien répondue à plusieurs reprises, mais j'accepte celui-ci à cause des exemples avec code généré.
Vérifiez l'IL, ceux-ci devraient compiler en extrêmement similaire, sinon exactement le même, code. Votre premier exemple est toujours une action différée, alors ne fonctionnera que lorsque vous le ferez. Le deuxième exemple est l'équivalent de la méthode d'extension du premier. En ce qui concerne les différences supplémentaires, vous devrez profiler, mais que la performance ne devrait pas être une préoccupation sur l'expressivité de travailler contre des ensembles de données. Si la performance est un problème, identifiez la piste chaude du code, puis examinez votre utilisation de LINQ (et plus loin, itérateurs). Faire cela en avant n'en vaut pas la peine la plupart du temps.
Il n'y a pas de différence notable parce que c'est presque la même chose. Le premier est compilé dans la syntaxe de la méthode et si vous attribuez ou non la requête à une variable n'affecte pas vraiment la performance.
C'est la même chose - l'OP n'est pas au courant de l'exécution retardée LINQ. Ce qui signifie que la commande arrive dans les deux fois dans le forach.