2017-06-07 2 views
0

Étant donné qu'un morceau de code chaud qui a un commutateur avec de nombreuses options de casse (et qui sont toutes avec des sauts, par exemple, peut être réarrangé) JVM va-t-il trouver les entrées fréquentes pour les vérifier avant les autres?Switch Java assez intelligent pour réorganiser?

+0

Il générera généralement une table de saut, de sorte que la question de «les vérifier avant les autres» ne se pose même pas. – EJP

+0

Donc non, si nous avons un switch avec 100s de cas nous ferions mieux d'implémenter une structure de données qui le fera (et même alors c'est aux tests de performance si cela vaut le coup) – vach

+1

** Non **. Le * compilateur * générera * la structure de données. – EJP

Répondre

2

La fréquence ou la probabilité d'exécution des cas individuels n'entrent pas en ligne de compte. Le compilateur génère soit:

  • une instruction tableswitch avec une table de saut associée qui est indexé directement par la valeur de commutation, ou
  • une instruction lookupswitch avec une table des paires de clés/cible qui peut (typiquement) binaire-recherché.

Voir le JVM Specification #3.10.

+2

Cela est vrai pour le compilateur 'javac'. Mais comme il y a une balise 'jit' dans la question, OP pourrait aussi s'intéresser à la façon dont cela fonctionne quand le compilateur JIT entre en jeu. Le compilateur HotSpot traite de façon similaire' tableswitch' et 'lookupswitch', et il ** prend en compte ** statistiques de fréquence ** collectées pendant la phase de profilage de la méthode. – apangin