Je parie que je pourrais répondre moi-même si j'en savais plus sur les outils pour analyser le comportement de C # / JIT, mais comme je ne le fais pas, veuillez me le demander.
J'ai un code simple comme celui-ci:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Comme vous pouvez le voir, j'ai mis AggressiveInlining parce que je pense qu'il devrait être intégré.
Je pense. Il n'y a aucune garantie que le JIT l'inclurait autrement. Ai-je tort?
Est-ce que faire ce genre de chose pourrait nuire aux performances / stabilité / quoi que ce soit?
Réponses:
Les compilateurs sont des bêtes intelligentes. Habituellement, ils extraient automatiquement autant de performances que possible de n'importe où.
Essayer de déjouer le compilateur ne fait généralement pas une grande différence et a beaucoup de chances de se retourner. Par exemple, l'inlining agrandit votre programme car il duplique le code partout. Si votre fonction est utilisée à de nombreux endroits dans le code, elle pourrait en fait être préjudiciable, comme l'a souligné @CodesInChaos. S'il est évident que la fonction doit être intégrée, vous pouvez parier que le compilateur le fera.
En cas d'hésitation, vous pouvez toujours faire les deux et comparer s'il y a un gain de performance, c'est le seul moyen certain pour l'instant. Mais mon pari est que la différence sera infaillible, le code source sera juste "plus bruyant".
la source
struct
s comme paramètres - où dans de nombreux cas, il devrait et pourrait. En plus de manquer des centaines d' optimisations évidentes - y compris, mais sans s'y limiter - éviter les vérifications et les allocations de limites inutiles, entre autres.Vous avez raison - il n'y a aucun moyen de garantir que la méthode sera intégrée - Énumération MSDN MethodImplOptions , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Les programmeurs sont plus intelligents qu'un compilateur, mais nous travaillons à un niveau supérieur et nos optimisations sont le produit du travail d'un seul homme - le nôtre. Jitter voit ce qui se passe pendant l'exécution. Il peut analyser à la fois le flux d'exécution et le code selon les connaissances qui y sont apportées par ses concepteurs. Vous pouvez mieux connaître votre programme, mais ils connaissent mieux le CLR. Et qui sera plus correct dans ses optimisations? Nous ne savons pas avec certitude.
C'est pourquoi vous devriez tester toute optimisation que vous faites. Même si c'est très simple. Et tenez compte du fait que l'environnement peut changer et que votre optimisation ou désoptimisation peut avoir un résultat assez inattendu.
la source
EDIT: Je me rends compte que ma réponse n'a pas répondu exactement à la question, alors qu'il n'y a pas de réel inconvénient, d'après mes résultats temporels, il n'y a pas de véritable avantage non plus. La différence entre un getter de propriété en ligne est de 0,002 seconde sur 500 millions d'itérations. Mon cas de test peut également ne pas être précis à 100% car il utilise une structure car il y a des mises en garde à la gigue et à l'inclusion de structures.
Comme toujours, la seule façon de vraiment savoir est d'écrire un test et de le comprendre. Voici mes résultats avec la configuration suivante:
Projet vide avec les paramètres suivants:
Résultats
Testé avec ce code:
la source
Les compilateurs font beaucoup d'optimisations. Inline est l'un d'entre eux, que le programmeur le veuille ou non. Par exemple, MethodImplOptions n'a pas d'option "en ligne". Parce que l'inline est fait automatiquement par le compilateur si nécessaire.
De nombreuses autres optimisations sont spécialement effectuées si elles sont activées à partir des options de construction, ou le mode "release" le fera. Mais ces optimisations sont en quelque sorte des optimisations "travaillées pour vous, génial! Non travaillées, laissez-le" et donnent généralement de meilleures performances.
est juste un indicateur pour le compilateur qu'une opération d'inline est vraiment souhaitée ici. Plus d'infos ici et ici
Pour répondre à ta question;
Vrai. Aucune garantie; Aucun C # n'a une option "forcer l'inline".
Dans ce cas, non, comme il est dit dans Écriture d'applications gérées hautes performances: une introduction
la source