Gente, eu tenho algumas perguntas:
- Existe uma diferença de desempenho no JavaScript entre uma
switch
declaração e umaif...else
? - Se sim, por quê?
- O comportamento
switch
e o comportamento sãoif...else
diferentes nos navegadores? (FireFox, IE, Chrome, Opera, Safari)
O motivo para fazer essa pergunta é que parece que eu obtive melhor desempenho em uma switch
declaração com aproximadamente 1000 casos no Firefox.
Editado Infelizmente este não é o meu código, o Javascript está sendo produzido no servidor a partir de uma biblioteca compilada e não tenho acesso ao código. O método que está produzindo o javascript é chamado
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
é uma lista separada por vírgula.
o que produz é
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Nota: onde [name]
= o nome passado para a função do lado do servidor
Agora mudei a saída da função a ser inserida em uma TextArea, escrevi algum código JavaScript para analisar a função e a converti em um conjunto de case
instruções.
finalmente, eu executo a função e ela funciona bem, mas o desempenho difere no IE e no Firefox.
fonte
Respostas:
Resposta em generalidades:
Site de teste
fonte
switch
eif/then
em JS. O artigo afirma que isso se deve àswitch
otimização irregular e às diferentes maneiras pelas quais os mecanismos JS funcionam. Citação:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Às vezes, é melhor usar nenhum dos dois. Por exemplo, em uma situação de "despacho", o Javascript permite fazer as coisas de uma maneira completamente diferente:
A configuração da ramificação de várias maneiras criando um objeto tem muitas vantagens. Você pode adicionar e remover funcionalidades dinamicamente. Você pode criar a tabela de despacho a partir dos dados. Você pode examiná-lo programaticamente. Você pode criar os manipuladores com outras funções.
Há a sobrecarga adicional de uma chamada de função para chegar ao equivalente a um "caso", mas a vantagem (quando há muitos casos) de uma pesquisa de hash para encontrar a função para uma chave específica.
fonte
A diferença de desempenho entre a
switch
eif...else if...else
é pequena, eles basicamente fazem o mesmo trabalho. Uma diferença entre eles que pode fazer a diferença é que a expressão a ser testada é avaliada apenas de vez emswitch
quando é avaliada para cada umaif
. Se é caro avaliar a expressão, fazê-lo uma vez é obviamente mais rápido do que fazê-lo cem vezes.A diferença na implementação desses comandos (e todos os scripts em geral) difere bastante entre os navegadores. É comum ver grandes diferenças de desempenho para o mesmo código em diferentes navegadores.
Como você dificilmente pode testar o desempenho de todo o código em todos os navegadores, opte pelo código que melhor se adequa ao que está fazendo e tente reduzir a quantidade de trabalho realizado, em vez de otimizar o desempenho.
fonte
Basicamente, use o que torna o código mais legível. Definitivamente, existem lugares onde uma ou outra construção contribui para uma limpeza, mais legibilidade e manutenção. Isso é muito mais importante que talvez salvando alguns nanossegundos no código JavaScript.
fonte
if..else
eswitch
causadas por uma combinação exclusiva de hardware e sistema operacional da versão do navegador e do sistema operacional.Diferente da sintaxe, um switch pode ser implementado usando uma árvore que o cria
O(log n)
, enquanto um if / else deve ser implementado com umaO(n)
abordagem procedural. Na maioria das vezes, eles são processados processualmente e a única diferença é a sintaxe. Além disso, isso realmente importa - a menos que você esteja digitando estaticamente 10 mil casos de if / else, afinal?fonte
A resposta de Pointy sugere o uso de um objeto literal como uma alternativa a
switch
ouif
/else
. Também gosto dessa abordagem, mas o código na resposta cria um novomap
objeto toda vez que adispatch
função é chamada:Se
map
contiver um grande número de entradas, isso poderá criar uma sobrecarga significativa. É melhor configurar o mapa de ação apenas uma vez e depois usar o mapa já criado a cada vez, por exemplo:fonte
Eu acho que não,
switch
é útil / curto se você quiser evitar váriasif-else
condições.O comportamento é o mesmo em todos os navegadores :)
fonte
switch is useful/short if you want prevent multiple if-else conditions.
Sim senhor, ótimo post.fonte
Acontece que if-else, se geralmente mais rápido do que mudar
http://jsperf.com/switch-if-else/46
fonte