2010-11-08 31 views
3

Ceci est une sorte de question noob. J'ai une simple propriétéQuand est une propriété "inline" par des optimisations de code

bool IsRoot { get { return parent==null; } } 

que j'appelle encore et plusieurs fois d'autres propriétés et méthodes au sein de la classe (et les classes dérivées)

J'aime garder comme ça, car il rend le code lisible (à moi), mais j'ai peur que tous les appels IsRoot vont me ralentir car ils pourraient ne pas être "inline" dans le code de version final. Ce que je veux dire par "inline" est qu'ils sont remplacés par une copie de l'évaluation parent==null à la place de get_IsRoot().

Quelqu'un peut-il m'expliquer quand (ou si) les propriétés sont en C#, et pour les applications orientées vers les performances, quelles sont les propriétés à éviter ou non?

EDIT_1: Réponse courte est: Propriétés se traduire par des appels purs de fonction et ils pourraient ou pourraient ne pas être inline selon ce que décide JIT. Faites confiance au système pour faire les bons choix et ne vous inquiétez pas des choses qui pourraient affecter les choses entre 5% et 10%, à moins qu'un profileur ne soit utilisé et que le résultat final soit ajusté pour la performance.

Merci pour les liens SO communauté, et j'espère qu'il y avait un moyen d'attribuer plusieurs réponses correctes. Désolé je devais en choisir un.

+0

Grande question. Ma conjecture est que ce sera presque toujours en ligne. Mais je ne suis pas sûr. Vous pouvez générer le code CLI produit par le compilateur et voir ce qu'il en est.John Skeet répondrait certainement à cette question s'il est là. –

+4

+1 Mis à part l'appât «premature-optimization!», C'est une question intéressante. :) –

+0

@Justin Une propriété appelée 'IsRoot' qui renvoie le résultat d'une comparaison booléenne rendrait * plus de sens * s'il s'agissait d'une méthode appelée' MakeRoot() '? Um ...? –

Répondre

2

Here is an OLD post from Eric Gunnerson qui parle de inline.
L'essentiel est que la gigue décide si ou une fonction doit être en ligne. D'après ce que je comprends, vous pouvez «encourager» l'inlining en rédigeant de petites fonctions, mais je ne sais pas si c'est vraiment fiable.

Here is another link à partir d'une question ici sur SO qui pose une question similaire. Beaucoup de bons liens sont inclus.

Voici un extrait de l'un des liens de la deuxième lien que j'ai posté:

Une méthode courte et simple qui est souvent utilisé peut être doublée dans le code d'appel. Actuellement, le JIT est documenté (peut-être «blogué sur» serait plus précis ici) pour inline méthodes qui sont moins de 32 octets de longueur, ne contiennent aucune logique de branchement complexe, et ne contiennent pas de mécanismes liés à la gestion des exceptions. Voir le blog de David Notario pour plus d'informations sur ce sujet (notez qu'il n'est pas entièrement pertinent pour CLR 2.0).

Je suppose que compte comme une indication approximative du moment où une méthode peut être inline, mais je ne pense pas que vous pouvez dire que si une méthode répond aux critères ci-dessus qu'il sera être mise en ligne .

Sur une note de côté, vous pouvez forcer une fonction à ne pas être inline l ike ceci:

[MethodImpl(MethodImplOptions.NoInlining)] 
public void DoNotInlineMe() 
{ 
    Console.WriteLine("Hello from non-inlined method"); 
} 
4

Je pense que cela répondra à votre question

Does C# inline properties?

+0

Nice! Et ainsi @Jon Skeet répond à cette question par procuration. Le cercle est complet. –