L' .NET CLR JIT compiler chaque méthode, chaque fois?
Je sais que Java est HotSpot équipe parfois sauter JIT compiler une méthode si l'on veut que la surcharge de la compilation être inférieur aux frais généraux de l'exécution de la méthode en mode interprété. L' .NET CLR travail basé sur une heuristique similaire?
Remarque: la réponse est "par" démarrer en contexte. Le code est normalement JITted chaque fois que vous exécutez le programme. À l'aide de ngen ou .NET Native les changements de l'histoire, trop...
À la différence de HotSpot, le CLR JIT toujours compile exactement une fois par run. Il n'a jamais interprète, et il ne recompile avec plus lourd optimisation qu'avant en fonction de l'utilisation réelle.
Cela peut changer, bien sûr, mais c'est comme ça depuis la v1 et je ne vous attendez pas à changer bientôt.
L'avantage est que cela rend le JIT beaucoup plus simple - il n'y a pas besoin de tenir compte des "vieux" code qui est déjà en cours d'exécution, annuler des optimisations basées sur des prémisses qui ne sont plus valables, etc.
Un point .NET faveur, c'est que la plupart des CLR langues rendre les méthodes non-virtuel par défaut, ce qui signifie beaucoup plus d'inlining peut être fait. HotSpot peut incorporer une méthode jusqu'à ce que c'est d'abord remplacée à quel point elle annule l'optimisation (ou certains trucs forts, dans certains cas, conditionnellement toujours utiliser le code inline, basé sur le type réel). Avec moins de méthodes virtuelles à s'inquiéter, .NET peut ignorer en grande partie de la douleur de ne pas être en mesure de inline rien de virtuel.
EDIT: ci-dessus décrit l'infrastructure de bureau. Le Compact Framework jette code natif quand il veut, JITting de nouveau au besoin. Cependant, ce n'est toujours pas comme les HotSpots adaptative d'optimisation.
Le micro framework n'a pas JIT à tous apparemment, l'interprétation du code à la place. Cela a un sens très limité d'appareils. (Je ne peux pas dire que je sais beaucoup de choses sur le micro framework.)
Je vois... donc la seule fois que l' .Net CLR s'exécute en mode interprété, c'est si le JIT est complètement éteint (pour le débogage).
Je ne crois pas qu'il fait interpréter le code, même alors, le débogueur est capable de parcourir le code compilé de façon appropriée, c'est tout. Mono t un interprète si.
Curieusement, .net MF (MicroFramework pour les périphériques embarqués) ne interpréter IL au lieu de les compiler.
Le CLR de bureau n'est pas à la hauteur (décharger) jitted code, il compile une méthode qu'une seule fois. Le CLR dans le .NET Compact Framework de présenter le code et re-jit quand c'est à nouveau nécessaire une adaptation de la plus environnements à ressources limitées. que le compact CLR s'exécute dans.
Oups - oui, va modifier mon trop-réponse générale quand j'ai la chance. Merci pour les corrections.
Oh, je vois... j'avais mal compris ceci: stackoverflow.com/questions/279582/... (et d'autres choses semblables) -- Apparemment, il ne s'éteint quelques optimisations dans le JIT. Merci pour l'explication!
Ne pas le CLR JIT compile sur chaque course? Il n'est pas exactement une fois car lorsque vous fermez et rouvrez votre programme, il va être jitted de nouveau. Je dirais exactement une fois pour chaque course, il serait plus clair
Voir si mon montage (dans les deux premiers paragraphes) est suffisant. Merci pour l'élévation de cette dernière.
Salut Jon, est-ce que votre réponse examiner les domaines d'application, le code d'accès de sécurité et est-il encore vrai pour les plus récents .NET frameworks comme 4.0, 4.5 et 4.6, qui n'étaient pas disponibles au moment de la rédaction de cette réponse? J'ai essayé de poser une nouvelle question, mais il est fermé en double stackoverflow.com/questions/42262201/...
Honnêtement, je n'en connais pas les détails, il y a - bien que je serais attendre de nouveaux domaines d'application à de nouveaux assemblages chargés de (autre que neutre assemblées) et être re-jitted. Je crois qu'il y a au moins se déplace autour de la mise en cache du code natif, mais je ne sais pas beaucoup de détails, j'en ai peur.
J'ai lu que Microsoft a décidé qu'IL sera toujours compilé, jamais interprété. Comment fonctionne le type d'encodage des informations dans les instructions de l'aide des interprètes de fonctionner plus efficacement?
Anders Hejlsberg: Si un interprète peut juste aveuglément ce que disent les instructions, sans avoir besoin de suivre ce qui est en haut de la pile, il peut aller plus vite. Quand il voit un iadd, par exemple, l'interprète n'est pas d'abord de comprendre à quel type d'ajouter qu'il est, il sait ce qu'est un nombre entier ajouter. En supposant que quelqu'un a déjà vérifié que la pile semble correct, il est sûr de couper un certain temps, et vous vous souciez que pour les services d'un interprète. Dans notre cas, cependant, nous n'avons jamais destiné à une cible interprété scénario avec le CLR. Nous avons l'intention de toujours JIT [Just-in-time compiler], et pour les besoins de l'équipe, nous avons besoin de suivre les informations de type de toute façon. Puisque nous avons déjà le type d'information, il ne fait pas de nous acheter quelque chose à mettre dans les instructions.
Bill Venners: Beaucoup de modernes machines virtuelles java [Java virtual machines] ne adaptative d'optimisation, où ils commencent par l'interprétation de bytecode. Ils ont le profil de l'application telle qu'elle va trouver les 10% à 20% du code qui est exécuté 80% à 90% du temps, alors qu'ils compiler que natif. Ils ne sont pas nécessairement juste-à-temps de compiler ces bytecode, cependant. Une méthode de bytecode peut encore être exécuté par l'interpréteur comme ils sont en train d'être compilé en natif et optimisé en arrière-plan. Lorsque le code natif est prêt, il peut remplacer le bytecode. En ne ciblant interprété scénario, avez-vous complètement exclu que l'approche de l'exécution dans un CLR?
Anders Hejlsberg: non, nous N'avons pas d'exclure totalement que. On peut encore interpréter. Nous ne sommes pas optimisé pour l'interprétation. Nous ne sommes pas optimisé pour l'écriture que la plus haute performance de l'interpréteur ne jamais interpréter. Je ne pense pas que quelqu'un n'est plus. Pour une set top box il y a 10 ans, ça aurait pu être intéressant. Mais il n'est plus intéressant. JIT technologies ont obtenu au point où vous pouvez avoir de multiples possibilités de JIT stratégies. Vous pouvez même pas imaginer à l'aide d'un rapide JIT qui vient déchire rapidement, et puis quand nous découvrons que nous sommes de l'exécution d'une méthode particulière de tous les temps, à l'aide d'un autre JIT qui passe un peu plus de temps et fait un meilleur travail d'optimisation. Il ya tellement plus que vous pouvez faire JIT-sage.
Il sera agréable de voir certains oligo-en fonction des Ece dans l'avenir pour les appareils avec peu de mémoire. Il faudrait surtout d'interpréter, de trouver les points chauds, et convertissez les en assembleur et cache ces. Je pense que c'est ce que Google fait avec leur Android JIT et Microsoft Research a un projet de recherche en cours à l'état de trace à base de JIT.
Je ne le crois pas, et je ne pense pas qu'il ne le devrait.
Comment le JIT savoir combien de fois une méthode particulière devrait être appelé? Ne serait pas la fréquence de l'interprétation facteur dans la prise de décision?
Je voudrais également question comment un compilateur JIT serait en mesure d'analyser une fonction pour déterminer si oui ou non l'interprétation serait mieux sans l'interprétation de la fonction elle-même. Et compte tenu de ce fait (au moins un passage de la méthode a eu lieu) ne serait-il pas mieux de simplement compiler chaque méthode pour réduire la surcharge d'essayer de déterminer les méthodes compilé en premier lieu?
D'exécution des mesures de performance peut vous dire si quelque chose doit être jitted, ainsi que l'agressivité il faut être jitted (b/c, quelques optimisations JIT prennent plus de temps que d'autres).
Juste une idée (je doute que HotSpot fonctionne comme ceci: vous permettre d'analyser certains trucs (comme la méthode de la longueur) de manière statique (lors de la génération de bytecode) et de décider que, et puis, il suffit de cocher cette méthode avec "ne pas compiler" peu, donc JIT sait qu'il ne devrait pas compiler, en cas de besoin, au lieu de cela, revenir à un interprète.
java.sun.com/products/hotspot/whitepaper.html - HotSpot peut remplacer le code en place, alors même que ce code est en cours d'exécution sur la pile. Par conséquent, une boucle peut commencer en mode interprété, mais complète dans JIT mode compilé une fois recompilation est complète.
Remarque: la réponse est "par" démarrer en contexte. Le code est normalement JITted chaque fois que vous exécutez le programme. À l'aide de ngen ou .NET Native les changements de l'histoire, trop...
À la différence de HotSpot, le CLR JIT toujours compile exactement une fois par run. Il n'a jamais interprète, et il ne recompile avec plus lourd optimisation qu'avant en fonction de l'utilisation réelle.
Cela peut changer, bien sûr, mais c'est comme ça depuis la v1 et je ne vous attendez pas à changer bientôt.
L'avantage est que cela rend le JIT beaucoup plus simple - il n'y a pas besoin de tenir compte des "vieux" code qui est déjà en cours d'exécution, annuler des optimisations basées sur des prémisses qui ne sont plus valables, etc.
Un point .NET faveur, c'est que la plupart des CLR langues rendre les méthodes non-virtuel par défaut, ce qui signifie beaucoup plus d'inlining peut être fait. HotSpot peut incorporer une méthode jusqu'à ce que c'est d'abord remplacée à quel point elle annule l'optimisation (ou certains trucs forts, dans certains cas, conditionnellement toujours utiliser le code inline, basé sur le type réel). Avec moins de méthodes virtuelles à s'inquiéter, .NET peut ignorer en grande partie de la douleur de ne pas être en mesure de inline rien de virtuel.
EDIT: ci-dessus décrit l'infrastructure de bureau. Le Compact Framework jette code natif quand il veut, JITting de nouveau au besoin. Cependant, ce n'est toujours pas comme les HotSpots adaptative d'optimisation.
Le micro framework n'a pas JIT à tous apparemment, l'interprétation du code à la place. Cela a un sens très limité d'appareils. (Je ne peux pas dire que je sais beaucoup de choses sur le micro framework.)
L' .NET runtime toujours compile le code JIT avant l'exécution. Donc, il n'est jamais interprété.
Vous pouvez trouver plus intéressant à lire dans CLR Choix de Conception avec Anders Hejlsberg. Surtout la partie:
Il sera agréable de voir certains oligo-en fonction des Ece dans l'avenir pour les appareils avec peu de mémoire. Il faudrait surtout d'interpréter, de trouver les points chauds, et convertissez les en assembleur et cache ces. Je pense que c'est ce que Google fait avec leur Android JIT et Microsoft Research a un projet de recherche en cours à l'état de trace à base de JIT.
J'ai trouvé un article, ÉPERON: UNE Trace à Base Compilateur JIT pour CIL.. Peut-être certains de cela rendra dans le CLR un jour?
Je ne le crois pas, et je ne pense pas qu'il ne le devrait.
Comment le JIT savoir combien de fois une méthode particulière devrait être appelé? Ne serait pas la fréquence de l'interprétation facteur dans la prise de décision?
Je voudrais également question comment un compilateur JIT serait en mesure d'analyser une fonction pour déterminer si oui ou non l'interprétation serait mieux sans l'interprétation de la fonction elle-même. Et compte tenu de ce fait (au moins un passage de la méthode a eu lieu) ne serait-il pas mieux de simplement compiler chaque méthode pour réduire la surcharge d'essayer de déterminer les méthodes compilé en premier lieu?