158 votes

Interrupteur Javascript vs. if...else if...else

Les gars, j'ai quelques questions :

  1. Y a-t-il une différence de performance en JavaScript entre un switch et une if...else ?
  2. Si oui, pourquoi ?
  3. Est-ce que le comportement de switch y if...else différent selon les navigateurs ? (FireFox, IE, Chrome, Opera, Safari)

La raison pour laquelle je pose cette question est qu'il me semble que j'obtiens de meilleures performances sur une switch avec environ 1000 cas dans Firefox.


Modifié Malheureusement, ce n'est pas mon code, le Javascript est produit par le serveur à partir d'une bibliothèque compilée et je n'ai pas accès au code. La méthode qui produit le javascript s'appelle

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]
  }
}

Note : où [name] = le nom passé dans la fonction côté serveur

Maintenant, j'ai modifié la sortie de la fonction pour qu'elle soit insérée dans un TextArea, j'ai écrit du code JavaScript pour analyser la fonction et je l'ai convertie en un ensemble d'éléments d'information. case déclarations.

Enfin, j'exécute la fonction et elle fonctionne bien mais les performances diffèrent dans IE et Firefox.

1 votes

Je suggère un échantillon de code pour examiner ce qui est optimal. Je veux dire, il doit y avoir une raison pour laquelle vous demandez ça, non ?

1 votes

Veuillez poster ce que vous faites, parce qu'il y a très peu de cas dans ma longue expérience pour lesquels je dirais qu'une instruction switch de 100 cas ou une série de 100 if/else est une bonne idée.

0 votes

Désolé les gars, pas des centaines mais des milliers de conditions

120voto

Tommy Points 17332

Répondre par des généralités :

  1. Oui, en général.
  2. Voir plus d'informations ici
  3. Oui, parce que chaque moteur de traitement JS est différent. Cependant, lors d'un test effectué sur le site ci-dessous, le switch a toujours été plus performant que le if, elseif sur un grand nombre d'itérations.

Site d'essai

0 votes

Merci Tommy, votre site d'exemple était agréable à utiliser pour essayer de déterminer la différence de performance entre if et switch. Il est si minime qu'il m'a conduit à la conclusion que mon problème était ailleurs, comme je l'ai noté dans mon commentaire avec ma question. Merci pour votre temps.

1 votes

Si vous voulez savoir quand utiliser les conditionnels, voici un lien direct vers un segment de l'article qui traite de ce sujet : oreilly.com/serveur-administration/excerpts/sites web encore plus rapides/

2 votes

@Tommy Bon article, merci de le partager. Cependant, l'article indique qu'il y a une différence de performance négligeable entre switch y if/then en JS. L'article indique que cela est dû à des switch et les différents modes de fonctionnement des différents moteurs JS. Citation : Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.

69voto

Pointy Points 172438

Parfois, il est préférable de n'utiliser ni l'un ni l'autre. Par exemple, dans une situation de "dispatch", Javascript vous permet de faire les choses d'une manière complètement différente :

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

La mise en place d'un branchement à plusieurs voies par la création d'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 de répartition à partir de données. Vous pouvez l'examiner de manière programmatique. Vous pouvez construire les gestionnaires avec d'autres fonctions.

Il y a la surcharge 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 clé particulière.

3 votes

Votre stratégie est bonne et je l'utilise souvent. Mais comme l'a souligné @Michael Geary stackoverflow.com/a/45336805/5936119 la variable map doit être déclarée en dehors du contexte de distribution, sinon elle sera toujours réévaluée.

0 votes

@DanielSantana vrai mais je doute que cela soit significativement cher. En particulier, une fois qu'une fonction est initialement analysée, la fonction code n'a pas besoin d'être régénéré, car le texte est statique.

22voto

Guffa Points 308133

La différence de performance entre un switch y if...else if...else est petit, ils font fondamentalement le même travail. Une différence entre eux, qui peut faire la différence, est que l'expression à tester n'est évaluée qu'une seule fois dans un fichier switch alors qu'il est évalué pour chaque if . 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 script en général) diffère assez fortement 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 il est difficile de tester les performances de tout le code dans tous les navigateurs, vous devez opter pour le code qui convient le mieux à ce que vous faites, et essayer de réduire la quantité de travail effectué plutôt que d'optimiser la façon dont il est effectué.

7voto

Evan Carroll Points 13420

Outre la syntaxe, un commutateur peut être implémenté à l'aide d'un arbre, ce qui le rend O(log n) tandis qu'un si/seulement doit être mis en œuvre avec un O(n) approche procédurale. Le plus souvent, ils sont tous deux traités de manière procédurale et la seule différence réside dans la syntaxe. D'ailleurs, est-ce vraiment important - à moins que vous ne tapiez statiquement 10 000 cas de if/else de toute façon ?

1 votes

7 ans plus tard... Je ne vois pas comment la mise en œuvre de l'arbre est possible, sauf dans un cas de valeurs numériques constantes).

0 votes

3,5 ans plus tard... @Ed Staub Bien sûr que c'est le cas ici. Les instructions Switch fonctionnent avec des constantes. Qu'il s'agisse de nombres ou d'autres choses, elles peuvent être énumérées, ce qui permet de construire un arbre.

0 votes

@trollkotze Si les constantes sont les plus courantes, les clauses de cas peuvent être n'importe quelle expression. Voir par exemple stackoverflow.com/questions/3463833/ .

6voto

Jon Benedicto Points 7020
  1. S'il y a une différence, elle ne sera jamais assez importante pour être remarquée.
  2. N/A
  3. Non, ils fonctionnent tous de manière identique.

En gros, utilisez ce qui rend le code le plus lisible. Il y a certainement des endroits où l'une ou l'autre construction est plus propre, plus lisible et plus facile à maintenir. C'est bien plus important que de gagner quelques nanosecondes dans le code JavaScript.

5 votes

En javascript notamment, la sémantique et la lisibilité (et donc la maintenabilité) l'emportent sur les différences de performances localisées entre if..else y switch causée par une combinaison unique de matériel informatique et de système d'exploitation de la version du navigateur.

2 votes

Je ne sais pas si je suis d'accord, cela pourrait en effet être remarqué s'il est utilisé dans une boucle avec, disons, une grande base de données, en parcourant un arbre, etc.

3 votes

Je ne suis absolument pas d'accord. les applications web devenant de plus en plus complexes, cette différence pourrait être significative pour l'application et pourrait changer en fonction des navigateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X