Le try-catch accélère mon code ?

Le try-catch accélère mon code ?

L’un des ingénieurs de Roslyn spécialisé dans la compréhension de l’optimisation de l’utilisation de la pile a examiné cela et me rapporte qu’il semble y avoir un problème dans l’interaction entre la façon dont le compilateur C# génère les stockages de variables locales et la façon dont le compilateur JIT effectue l’allocation de registres dans le code x86 correspondant. Le résultat est une génération de code sous-optimale pour les chargements et stockages des variables locales.

Pour une raison obscure pour nous tous, le chemin de génération de code problématique est évité lorsque le JITter sait que le bloc est dans une région protégée par un try.

C’est assez étrange. Nous allons en discuter avec l’équipe du JITter et voir si nous pouvons faire enregistrer un bogue pour qu’ils puissent corriger cela.

De plus, nous travaillons sur des améliorations pour Roslyn des algorithmes des compilateurs C# et VB pour déterminer quand les variables locales peuvent être rendues « éphémères » – c’est-à-dire simplement poussées et retirées de la pile, plutôt qu’occuper un emplacement spécifique sur la pile pendant toute la durée de l’activation. Nous pensons que le JITter sera capable de mieux gérer l’allocation de registres et autres si nous lui donnons de meilleures indications sur le moment où les variables locales peuvent être considérées comme « mortes » plus tôt.

Merci d’avoir porté cela à notre attention, et désolé pour ce comportement étrange.