Les gars, j'ai quelques questions:
- Existe-t-il une différence de performances en JavaScript entre une
switch
instruction et unif...else
? - Si oui, pourquoi?
- Le comportement
switch
et le comportement desif...else
navigateurs sont-ils différents? (FireFox, IE, Chrome, Opera, Safari)
La raison pour laquelle je pose cette question est qu'il semble que j'obtiens de meilleures performances sur une switch
déclaration avec environ 1000 cas dans Firefox.
Edité Malheureusement ce n'est pas mon code, le Javascript est en cours de production depuis une bibliothèque compilée et je n'ai pas accès au code. La méthode qui produit le javascript est appelée
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
est une liste séparée par des virgules.
ce qu'il produit est
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Remarque: où [name]
= le nom passé dans la fonction côté serveur
Maintenant, j'ai changé la sortie de la fonction à insérer dans un TextArea, j'ai écrit du code JavaScript pour analyser la fonction et je l'ai converti en un ensemble d' case
instructions.
enfin je lance la fonction et elle fonctionne bien mais les performances diffèrent dans IE et Firefox.
la source
Réponses:
Répondre en général:
Site de test
la source
switch
etif/then
dans JS. L'article indique que cela est dû à uneswitch
optimisation inégale et aux différentes façons dont les différents moteurs JS fonctionnent. Citation:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Parfois, il vaut mieux n'utiliser ni l'un ni l'autre. Par exemple, dans une situation de «répartition», Javascript vous permet de faire les choses d'une manière complètement différente:
La configuration du branchement multi-directionnel en créant un objet présente de nombreux avantages. Vous pouvez ajouter et supprimer des fonctionnalités de manière dynamique. Vous pouvez créer la table d'expédition à partir des données. Vous pouvez l'examiner par programme. Vous pouvez créer les gestionnaires avec d'autres fonctions.
Il y a la surcharge supplémentaire d'un appel de fonction pour obtenir l'équivalent d'un "cas", mais l'avantage (quand il y a beaucoup de cas) d'une recherche de hachage pour trouver la fonction pour une touche particulière.
la source
La différence de performance entre a
switch
etif...else if...else
est faible, ils font essentiellement le même travail. Une différence entre eux qui peut faire une différence est que l'expression à tester n'est évaluée qu'une fois de temps enswitch
temps, elle est évaluée pour chacunif
. S'il est coûteux d'évaluer l'expression, le faire une fois est bien sûr plus rapide que de le faire cent fois.La différence d'implémentation de ces commandes (et de tous les scripts en général) diffère un peu entre les navigateurs. Il est courant de voir des différences de performances assez importantes pour le même code dans différents navigateurs.
Comme vous pouvez difficilement tester les performances de tout le code dans tous les navigateurs, vous devez choisir le code qui correspond le mieux à ce que vous faites et essayer de réduire la quantité de travail effectuée plutôt que d'optimiser la façon dont cela est fait.
la source
En gros, utilisez ce qui rend le code le plus lisible. Il y a certainement des endroits où l'une ou l'autre des constructions est plus propre, plus lisible et plus maintenable. C'est bien plus important que d'économiser peut-être quelques nanosecondes en code JavaScript.
la source
if..else
etswitch
causée par une combinaison unique de matériel informatique et de système d'exploitation.Autre que la syntaxe, un commutateur peut être implémenté en utilisant un arbre qui le fait
O(log n)
, tandis qu'un if / else doit être implémenté avec uneO(n)
approche procédurale. Le plus souvent, ils sont tous deux traités de manière procédurale et la seule différence est la syntaxe, et de plus, est-ce vraiment important - à moins que vous ne tapiez statiquement 10k cas de if / else de toute façon?la source
La réponse de Pointy suggère l'utilisation d'un objet littéral comme alternative à
switch
ouif
/else
. J'aime aussi cette approche, mais le code de la réponse crée un nouvelmap
objet à chaque fois que ladispatch
fonction est appelée:Si
map
contient un grand nombre d'entrées, cela peut créer une surcharge importante. Il est préférable de ne configurer la carte d'action qu'une seule fois, puis d'utiliser la carte déjà créée à chaque fois, par exemple:la source
Je ne pense pas,
switch
c'est utile / court si vous voulez éviter plusieursif-else
conditions.Le comportement est le même dans tous les navigateurs :)
la source
switch is useful/short if you want prevent multiple if-else conditions.
Oui monsieur, super message.la source
Il s'avère que if-else est généralement plus rapide que switch
http://jsperf.com/switch-if-else/46
la source