Preocupado com o desempenho do meu aplicativo da web, pergunto-me qual das declarações "if / else" ou switch é melhor em relação ao desempenho?
122
Preocupado com o desempenho do meu aplicativo da web, pergunto-me qual das declarações "if / else" ou switch é melhor em relação ao desempenho?
if
etc.Respostas:
Isso é micro otimização e otimização prematura, que são más. Preocupe-se com a legibilidade e a manutenção do código em questão. Se houver mais de dois
if/else
blocos colados ou seu tamanho for imprevisível, você poderá considerar umaswitch
declaração.Como alternativa, você também pode pegar o polimorfismo . Primeiro, crie alguma interface:
E conheça todas as implementações em algumas
Map
. Você pode fazer isso estaticamente ou dinamicamente:Finalmente substitua o
if/else
ouswitch
por algo assim (deixando verificações triviais como nullpointers de lado):Ele pode ser microslower do que
if/else
ouswitch
, mas o código é pelo menos muito melhor manutenção.Enquanto você fala sobre aplicativos da web, pode usar
HttpServletRequest#getPathInfo()
como chave de ação (eventualmente escreva mais um código para dividir a última parte do pathinfo em um loop até que uma ação seja encontrada). Você pode encontrar aqui respostas semelhantes:Se você está preocupado com o desempenho de aplicativos da Web Java EE em geral, também poderá achar este artigo útil. Existem outras áreas que oferecem um ganho de desempenho muito maior do que apenas a otimização (micro) do código Java bruto.
fonte
Concordo totalmente com a opinião de que a otimização prematura é algo a ser evitado.
Mas é verdade que a Java VM possui bytecodes especiais que podem ser usados para os switches ().
Consulte WM Spec ( lookupswitch e tableswitch )
Portanto, pode haver alguns ganhos de desempenho, se o código fizer parte do gráfico da CPU de desempenho.
fonte
É extremamente improvável que um if / else ou um switch sejam a fonte dos seus problemas de desempenho. Se você estiver tendo problemas de desempenho, faça uma análise de perfil de desempenho primeiro para determinar onde estão os pontos lentos. Otimização prematura é a raiz de todo o mal!
No entanto, é possível falar sobre o desempenho relativo do switch vs. if / else com as otimizações do compilador Java. Primeiro, observe que, em Java, as instruções switch operam em um domínio - número inteiro muito limitado. Em geral, você pode visualizar uma instrução switch da seguinte maneira:
onde
c_0
,,c_1
... ec_N
são números inteiros que são alvos da instrução switch e<condition>
devem ser resolvidos para uma expressão inteira.Se esse conjunto for "denso" - ou seja, (max (c i ) + 1 - min (c i )) / n> α, onde 0 <k <α <1, onde
k
é maior que algum valor empírico, a A tabela de salto pode ser gerada, o que é altamente eficiente.Se esse conjunto não for muito denso, mas n> = β, uma árvore de pesquisa binária poderá encontrar o destino em O (2 * log (n)), que também é eficiente também.
Para todos os outros casos, uma instrução switch é exatamente tão eficiente quanto a série equivalente de instruções if / else. Os valores precisos de α e β dependem de vários fatores e são determinados pelo módulo de otimização de código do compilador.
Finalmente, é claro, se o domínio de
<condition>
não for o número inteiro, uma instrução switch será completamente inútil.fonte
Use o interruptor!
Eu odeio manter blocos if-else! Faça um teste:
Meu código padrão C # para benchmarking
fonte
switch
es?Lembro-me de ler que existem 2 tipos de instruções Switch no bytecode Java. (Eu acho que estava no 'Java Performance Tuning'. One é uma implementação muito rápida que usa os valores inteiros da instrução switch para saber o deslocamento do código a ser executado. Isso exigiria que todos os números inteiros fossem consecutivos e em um intervalo bem definido Suponho que o uso de todos os valores de um Enum também se enquadre nessa categoria.
Mas eu concordo com muitos outros pôsteres ... pode ser prematuro se preocupar com isso, a menos que seja um código muito, muito quente.
fonte
switch
várias maneiras diferentes, algumas mais eficientes que outras. Em geral, a eficiência não será pior do que uma "if
escada " direta , mas há variações suficientes (especialmente com o JITC) que dificilmente será mais preciso do que isso.De acordo com Cliff Click em sua palestra em Java One A 2009 A Crash Course in Modern Hardware :
Você pode obter os slides completos aqui .
Cliff dá um exemplo (terminando no Slide 30) mostrando que, mesmo com a CPU fazendo renomeação de registro, previsão de ramificação e execução especulativa, só é possível iniciar 7 operações em 4 ciclos de clock antes de ter que bloquear devido a duas falhas de cache que são necessárias 300 ciclos de relógio para retornar.
Então, ele diz que para acelerar seu programa, você não deve considerar esse tipo de problema menor, mas em problemas maiores, como se você está fazendo conversões desnecessárias no formato de dados, como a conversão de "SOAP → XML → DOM → SQL →… "what" passa todos os dados pelo cache ".
fonte
No meu teste, o melhor desempenho é ENUM> MAP> SWITCH> IF / ELSE IF no Windows7.
fonte
Time taken for String in Switch :3235 Time taken for String in if/else if :3143 Time taken for String in Map :4194 Time taken for String in ENUM :2866
Para a maioria
switch
e a maioria dosif-then-else
blocos, não consigo imaginar que haja alguma preocupação significativa ou significativa relacionada ao desempenho.Mas eis o seguinte: se você estiver usando um
switch
bloco, seu próprio uso sugere que você esteja ativando um valor obtido de um conjunto de constantes conhecidas em tempo de compilação. Nesse caso, você realmente não deveria usarswitch
instruções, se puder usarenum
métodos com constantes específicas.Comparado a uma
switch
declaração, um enum fornece melhor segurança e código de tipo, mais fáceis de manter. As enums podem ser projetadas para que, se uma constante for adicionada ao conjunto de constantes, seu código não seja compilado sem fornecer um método específico para a constante para o novo valor. Por outro lado, esquecer de adicionar um novocase
a umswitch
bloco às vezes só pode ser detectado em tempo de execução se você tiver a sorte de configurar seu bloco para lançar uma exceção.O desempenho entre
switch
e umenum
método específico de constante não deve ser significativamente diferente, mas o último é mais legível, mais seguro e mais fácil de manter.fonte