Deux points d'interrogation ('??') vs si lors de l'attribution des mêmes var
Se référant à la suite de SE répondre.
Lors de l'écriture de
A = A ?? B;
c'est le même que
if( null != A )
A = A;
else
A = B;
Est-ce à dire que
if( null == A ) A = B;
serait préférable, performance sage?
Ou puis-je supposer que le compilateur optimise le code, lorsque le même objet est dans le ??
notation?
Oui, le gain de performance est ici inexistante.
Écrire les deux versions, la compilation, l'utilisation ILDasm ou dotPeek pour voir si il y a une différence dans le code généré.
Moins de marques de lisibilité. Vérifier si une valeur null est égal à rien n'a pas vraiment de sens. Peut-être juste une préférence, mais j'ai toujours utiliser if (A != null). Vous effectuez un contrôle sur Une, pas la valeur null.
L'ordonnance d'une condition est surtout une préférence. Je trouve ça plus lisible de mettre la valeur de comparaison sur la gauche, comme il met l'accent sur le résultat final. L'habitude est ancienne, et les tiges de codage en C et C++ où '=' pourrait accidentellement attribuer tout en comparant, en C#, il n'est plus pertinent, mais je trouve la comparaison plus lisible. Si vous avez tout intérêt en C/C++ découvrez la toujours pertinente, Efficace C++ livre (rads.stackoverflow.com/amzn/click/0321334876), voir aussi la discussion suivante: stackoverflow.com/questions/6883646/obj-null-vs-null-obj
Écrire les deux versions, la compilation, l'utilisation ILDasm ou dotPeek pour voir si il y a une différence dans le code généré.
Moins de marques de lisibilité. Vérifier si une valeur null est égal à rien n'a pas vraiment de sens. Peut-être juste une préférence, mais j'ai toujours utiliser if (A != null). Vous effectuez un contrôle sur Une, pas la valeur null.
L'ordonnance d'une condition est surtout une préférence. Je trouve ça plus lisible de mettre la valeur de comparaison sur la gauche, comme il met l'accent sur le résultat final. L'habitude est ancienne, et les tiges de codage en C et C++ où '=' pourrait accidentellement attribuer tout en comparant, en C#, il n'est plus pertinent, mais je trouve la comparaison plus lisible. Si vous avez tout intérêt en C/C++ découvrez la toujours pertinente, Efficace C++ livre (rads.stackoverflow.com/amzn/click/0321334876), voir aussi la discussion suivante: stackoverflow.com/questions/6883646/obj-null-vs-null-obj
OriginalL'auteur Lockszmith | 2012-07-10
Vous devez vous connecter pour publier un commentaire.
Ne vous inquiétez pas à propos de la performance, il sera négligeable.
Si vous êtes curieux à ce sujet, écrire un peu de code pour tester les performances à l'aide de
Stopwatch
et voir. Je soupçonne que vous aurez besoin de faire quelques millions d'itérations pour commencer à voir les différences.Vous ne pouvez pas assumer sur la mise en œuvre de choses, ils sont susceptibles de changer dans l'avenir invalider les hypothèses.
Mon hypothèse, c'est la différence de performances est probablement très, très petit. J'irais pour le nul de la coalescence de l'opérateur pour des raisons de lisibilité, personnellement, c'est agréable et de condenser la matière et qui transmet le point assez bien. J'ai parfois le faire pour les paresseux-la charge de la vérification:
J'étais juste sur le point d'essayer VCD code quand j'ai remarqué l'artificiel setter. Elle soulève un bon point, je vais vous donner, mais de profilage des performances en surbrillance. Les mauvaises pratiques dans la forme de mauvais accesseurs de propriété ne devrait pas dicter une utilisation du style sur
??
. Les effets secondaires n'est pas au-dessus de la coalescence de l'opérateur, c'est parce que l'opérateur dans votre exemple est utilisé en conjonction avec d'affectation.vous avez raison, j'ai lu le code de nouveau, et sa réponse n'a rien à voir avec l' ?? l'opérateur, mais avec la valeur de ce qui est de l'affectation à. Je vais passer la accepté de répondre à revenir ici. Bonne prise. (note à moi-même: lire le code de manière plus approfondie à la prochaine fois)
OriginalL'auteur Adam Houldsworth
Mon conseil serait d'inspecter l'IL (intermediate language) et de comparer les différents résultats. Ensuite, vous pouvez voir exactement ce que chacun se résume à de la et de décider ce qui est le plus optimisé. Mais comme Adam l'a dit dans son commentaire, vous êtes plus susceptible de mieux pour se concentrer sur la lisibilité/maintenabilité plus de performance dans quelque chose d'aussi petit.
EDIT: vous pouvez afficher le IL par l'utilisation de la ILDASM.exe livré avec visual studio et ouvrez votre assembly compilé.
OriginalL'auteur OnResolve
J'ai juste essayé ce en C# - très rapidement, il pourrait donc y avoir une erreur dans ma méthode. J'ai utilisé le code suivant et a déterminé que la deuxième méthode a pris environ 1,75 fois plus long que le premier.
@Lockszmith: Après l'édition ci-dessous, le ratio était de 1.115 en faveur de la 1ère mise en œuvre
Même si ils ont pris la même heure, je serais personnellement utiliser la construction du langage qui est intégré, ce qu'il exprime votre intentions plus clairement à toutes les futures compilateur qui peut avoir plus intégré dans les optimisations.
@Lockszmith: j'ai édité le code pour prendre en compte les recommandations de la commentaires
Pas vraiment, l' ?? la route n'null vérifier et d'affectation chaque fois, alors que le
A == null
route est tout simplement le nul de vérifier et de non-cession. Essayez un test oùA
besoins attribution de tous de temps. Aussi, l'utilisationStopwatch
par opposition àDateTime
, il est plus précis. De Plus, vous devez faire au moins un exécuter pour s'assurer que le lot a été JIT avais avant de faire un calendrier de l'exécuter.Merci pour le code, j'ai édité votre réponse pour prendre en compte les suggestions ci-dessus, et l'exécuter dans le LINQpad, il est encore en favorisant la "version longue", mais comme tout ce qui est mentionné, ce qui compte ici, c'est la lisibilité et votre test prouve qu'elle est négligeable.
OriginalL'auteur Stephen Hewlett
Bien que la performance de
??
est négligeable, les effets secondaires peuvent parfois ne pas être négligeable. Considérons le programme suivant.Exécuter résultat sur mon PC.
Car il y a un devoir à l'aide de
??
, et l'exécution de la mission, parfois peut ne pas garanti. Cela pourrait conduire à un problème de performances.Je préfère utiliser
if( null == A ) A = B;
au lieu deA = A ?? B;
.bon point, totalement raté.
Encore @VCD soulevé un point à surveiller lors de l'utilisation de (toute) la cession.
Peut-être que le terme que j'utilise n'était pas assez précis, plutôt que de
side-effect not negligible
je devrais peut-être utiliser le mondeend result is unexpected
.OriginalL'auteur VCD