Lors d'une revue de code avec un employé de Microsoft, nous sommes tombés sur une grande section de code à l'intérieur d'un try{}
bloc. Elle et un représentant de l'informatique ont suggéré que cela peut avoir des effets sur la performance du code. En fait, ils ont suggéré que la majeure partie du code devrait se trouver en dehors des blocs try/catch, et que seules les sections importantes devraient être vérifiées. L'employé de Microsoft a ajouté et dit qu'un livre blanc à venir met en garde contre les blocs try/catch incorrects.
J'ai cherché et je l'ai trouvé peut affecter les optimisations mais il semble qu'elle ne s'applique que lorsqu'une variable est partagée entre plusieurs scopes.
Je ne m'interroge pas sur la maintenabilité du code, ni même sur le traitement des bonnes exceptions (le code en question a besoin d'être refactoré, sans aucun doute). Je ne fais pas non plus référence à l'utilisation des exceptions pour le contrôle du flux, ce qui est clairement faux dans la plupart des cas. Ce sont des questions importantes (certaines sont plus importantes), mais ce n'est pas le sujet ici.
Comment les blocs try/catch affectent-ils les performances lorsque les exceptions sont pas jeté ?
171 votes
"Celui qui sacrifie la correction à la performance ne mérite ni l'une ni l'autre."
3 votes
Joel - J'ai clairement dit que ce n'était pas le but, je ne fais pas de micro-optimisations, et un bon code est plus important pour moi, je sais mieux que cela (je suis le développeur, pas le gars de l'informatique). Il s'agit d'une question technique.
1 votes
Donc vous mangez les exceptions, et ne les jetez pas ? Traitez-vous alors le cas d'échec ou faites-vous quelque chose ?
0 votes
Je pense que quelqu'un devrait sortir l'ILDasm et nous le faire savoir.
25 votes
Cela dit, il n'est pas toujours nécessaire de sacrifier l'exactitude aux performances.
0 votes
@mohlsen - non. Il n'y a pas d'exception. Le code fonctionne bien, mais entouré d'un bloc try.
0 votes
Kobi - Il n'y a que deux réponses possibles à votre question : "oui" ou "non". Si "non", alors la seule utilisation possible de l'information est de justifier l'ajout ou le retrait de blocs try/catch inutiles ou encombrants. Si "oui", alors la seule utilisation possible de l'information est de justifier la suppression des blocs try/catch qui ne devraient probablement pas être supprimés.
31 votes
Pourquoi pas la simple curiosité ?
86 votes
@Joel : Peut-être que Kobi veut juste connaître la réponse par curiosité. Savoir si les performances seront meilleures ou moins bonnes ne signifie pas nécessairement qu'il va faire des folies avec son code. La recherche de la connaissance pour elle-même n'est-elle pas une bonne chose ?
0 votes
Pourquoi y a-t-il un bloc try...catch si une exception n'est pas levée ? Sens du code.
1 votes
Joel - La question a été soulevée lors d'une réunion et figure sur notre liste. Personnellement, je ne pense pas que cela soit utile, mais je veux d'autres avis.
1 votes
J'ai vu de très mauvaises pratiques de programmation sortir de MS. Ne prenez pas votre connaissance comme une autorité juste parce qu'elle y a travaillé.
2 votes
David - C'est pourquoi j'ai dit que je n'avais jamais entendu parler d'un tel problème, et c'est pourquoi je pose cette question.
10 votes
Voici un bon algorithme pour savoir s'il faut faire ce changement ou non. Premièrement, fixez des objectifs de performance significatifs basés sur le client. Deuxièmement, écrivez le code pour qu'il soit d'abord correct et clair. Troisièmement, testez-le par rapport à vos objectifs. Quatrièmement, si vous atteignez vos objectifs, quittez le travail plus tôt et allez à la plage. Cinquièmement, si vous n'atteignez pas vos objectifs, utilisez un profileur pour trouver le code qui est trop lent. Sixièmement, si ce code est trop lent à cause d'un gestionnaire d'exceptions inutile, supprimez le gestionnaire d'exceptions. Sinon, corrigez le code qui est réellement trop lent. Revenez ensuite à la troisième étape.
1 votes
Knuth a mis en garde contre l'optimisation prématurée : fr.wikiquote.org/wiki/Donald_Knuth
1 votes
Il semble y avoir un cas, qui me semble évident, que les gens n'envisagent pas : Un bloc try/catch qui permet de savoir où et comment se situe le problème lorsqu'un programme doit être interrompu et arrêté.
1 votes
@Ama - On dirait que c'est exactement ce que vous devriez faire. Pour être explicite - j'ai demandé si un
try
/catch
le bloc est mauvais - et la réponse était "Non, c'est génial - utilisetry
/catch
!" . Vous ne voulez certainement pas que ces messages d'erreur affreux s'affichent pour vos utilisateurs.0 votes
Alors pourquoi ne pas essayer d'attraper le projet entier ?
1 votes
@SerdarSamancolu vous pouvez, voir ici : docs.microsoft.com/fr/us/dotnet/api/ Le vrai problème avec Try..Catch, c'est quand on s'attend à attraper souvent . Car l'application construit alors une trace de pile, qui consomme des ressources. Cela brise également le flux naturel de votre application, ce qui n'est pas recommandé non plus. En résumé, vous devez utiliser ces Try...Catch pour nettoyer les erreurs, et non pour gérer un flux logique.