Préoccupé par les performances de mon application Web, je me demande laquelle des déclarations "if / else" ou switch est la meilleure en ce qui concerne les performances?
Réponses
Trop de publicités?Je suis totalement d'accord avec l'opinion que l'optimisation prématurée est quelque chose à éviter.
Mais il est vrai que la machine virtuelle Java a des bytecode, qui pourrait être utilisé pour switch ().
Voir WM Spec (lookupswitch et tableswitch)
Il pourrait donc y avoir quelques gains de performances, si le code est la partie de la performance du PROCESSEUR graphique.
C'est la micro-optimisation et optimisation prématurée, qui sont le mal. Plutôt s'inquiéter readabililty et la maintenabilité du code en question. Si il y a plus de deux if/else
blocs collés ensemble ou sa taille est imprévisible, alors vous pouvez très considérons un switch
déclaration.
Alternativement, vous pouvez également saisir le Polymorphisme. D'abord créer une interface:
public interface Action {
void execute(String input);
}
Et obtenir toutes les mises en œuvre dans certains Map
. Vous pouvez le faire soit de manière statique ou dynamique:
Map<String, Action> actions = new HashMap<String, Action>();
Enfin remplacer l' if/else
ou switch
par quelque chose comme ceci (en laissant trivial vérifie comme nullpointers de côté):
actions.get(name).execute(input);
Il peut être microslower qu' if/else
ou switch
, mais le code est au moins autant mieux maintenable.
Comme vous parlez d'applications, vous pouvez utiliser HttpServletRequest#getPathInfo()
comme clé de l'action (éventuellement écrire du code plus de diviser la dernière partie de pathinfo loin dans une boucle jusqu'à ce qu'une action est trouvé). Vous pouvez trouver ici des réponses similaires:
- http://stackoverflow.com/questions/1798232/using-a-custom-servlet-oriented-framework-too-many-servlets-is-this-an-issue/1798461#1798461
- http://stackoverflow.com/questions/2060128/java-front-controller/2060842#2060842
Si vous êtes à vous soucier de Java EE webapplication les performances en général, alors vous pouvez les trouver cet article utile. Il y a d'autres régions qui donne beaucoup plus de gain de performance que seuls les (micro)optimisation de la crue de code Java.
Il est extrêmement peu probable qu'un if/else ou un interrupteur va être la source de votre performance malheurs. Si vous rencontrez des problèmes de performances, vous devriez faire un profilage des performances de l'analyse d'abord, afin de déterminer où la lenteur des spots sont. L'optimisation prématurée est la racine de tous les maux!
Encore, vous avez demander à propos de la performance, et il est possible de parler de la performance relative de l'interrupteur contre si/d'autre avec le Java les optimisations du compilateur. Notons d'abord que dans Java, les instructions switch fonctionner sur un nombre très limité de domaine -- entiers. En général, vous pouvez afficher une instruction switch comme suit:
switch (<condition>) {
case c_0: ...
case c_1: ...
...
case c_n: ...
default: ...
}
où c_0
, c_1
, ..., c_N
font partie intégrante des nombres qui sont des cibles de l'instruction switch, et <condition>
doit correspondre à une expression entière.
Si cet ensemble est "dense" -- c'est, (max(ci) + 1 - min(c,i)) / n > α, où 0 < k < α < 1, où
k
est plus grande que certaines valeur empirique, un saut de la table peut être généré, qui est très efficace.Si cet ensemble n'est pas très dense, mais n >= β, un arbre de recherche binaire peut trouver la cible dans O(2 * log(n)) qui est toujours efficace.
Pour tous les autres cas, une instruction switch est exactement aussi efficace que l'équivalent de la série de if/else. La précision des valeurs de α et β dépendent d'un certain nombre de facteurs et sont déterminés par le compilateur de code-optimiziation module.
Enfin, bien sûr, si le domaine de l' <condition>
n'est pas le nombres entiers, un interrupteur
la déclaration est totalement inutile.
Selon Cliff Cliquez sur dans sa 2009 Java-On parler d'Un Cours intensif de Matériel Moderne:
Aujourd'hui, la performance est dominé par les modes d'accès à la mémoire. Le Cache dominent: la mémoire est le nouveau disque. [Diapositive 65]
Vous pouvez obtenir sa pleine glisse ici.
Falaise donne un exemple (finition sur la Diapositive 30) montrant que même avec le CPU fait registres de renommage, direction de la prévision, et la spéculation de l'exécution, il est seulement capable de commencer à 7 opérations en 4 cycles d'horloge avant d'avoir à les bloquer à cause de deux défauts de cache qui prennent 300 cycles d'horloge pour le retour.
Donc, il dit à la vitesse de votre programme, vous ne devriez pas être à la recherche pour ce genre de problème mineur, mais sur les plus grands tels que si vous faites des données inutiles des conversions de format, de telles que la conversion de "SAVON → XML → DOM → SQL → ..." qui "transmet toutes les données à travers le cache".