Je lis du matériel sur le fait que Java puisse être plus rapide que C ++ et sur la citation suivante: P>
Java peut être plus rapide que C ++ car les Jits peuvent en ligne sur les limites de la fonction virtuelle. P> blockQuote>
Pourquoi Java sera toujours plus lent que C ++ ( Lien de Wayback ) P>
Qu'est-ce que cela signifie? Cela signifie-t-il que le JIT peut apporter des appels de fonction virtuelle en ligne (car il a probablement accès à des informations sur le temps d'exécution) alors que C ++ doit appeler la fonction via sa table de table? P>
3 Réponses :
Pour ce que sa valeur, Java, C ++, assemblage fournira relativement la même performance. P>
Oui, de meilleures performances peuvent être obtenues avec Handoptimez C ++, C ou ASM ... Toutefois, pour le majorty d'applications (essayez tout en dehors des applications graphiques graves), ce n'est pas le goulot d'étranglement, et- la Le coût inférieur de la mise en œuvre compense toute performance inférieure perçue. P>
Étant donné que la compilation de Java Bytecode dans le code de la machine est différée jusqu'au moment de l'exécution, il est possible que JVMS soit effectué Optimisation guidée de profil et d'autres optimisations nécessitant des informations non disponibles jusqu'à ce que le code soit en cours d'exécution. Cela peut même inclure la "désoptimisation", où une optimisation précédemment effectuée est révoquée de sorte que d'autres optimisations puissent se produire. P>
Plus d'informations à propos de ceci peut être trouvée sous Optimisation adaptative sur Wikipedia, qui comprend des optimisations liées à l'allusion. P>
Je comprends qu'il existe des compilateurs C ++ pouvant utiliser des informations de profil pour déterminer s'il faut ces optimiser. Le problème réel avec C ++ est que le modèle de liaison standard signifie que l'appelant et la callee ne sont pas nécessairement compilés ensemble.
Ouais, la nouvelle GCC peut faire ce genre d'optimisation du temps de liaison (LTO).
La réponse à votre question est oui: c'est ce que le texte cité signifie. P>
Le JIT analysera toutes les classes chargées. S'il peut déterminer qu'il n'existe qu'une méthode possible qui puisse être appelée à tout point donné, elle peut éviter l'envoi et (le cas échéant) en ligne le corps de la méthode. P>
En revanche, un compilateur C ++ ne connaît pas tous les sous-types éventuels et ne peut donc pas déterminer si cette optimisation peut être effectuée pour une méthode (virtuelle). (Et au moment où la liaison fonctionne, il est trop tard ...) p>
D'autres réponses ont déclaré que vous pouvez effectuer cette optimisation à la main en C ++ ... mais cela suppose que vous (le programmeur) peut faire l'analyse vous-même et modifier des méthodes de virtuelles à des non-virtuelles. Mais si vous vous trompez, vous avez un bug pour suivre. P>
Au fait, nous pouvons supposer que cette optimisation
Un avantage est que les getters et les setters peuvent être inlinés de sens une protection complète d'abstraction (codage aux interfaces et toutes) sans payer automatiquement une pénalité à chaque fois.