Otimizando instruções switch-case

Os maiores gargalos para tornar um código eficiente hoje em dia são os desvios no código que dependentes de alguma verificação. Você deve ouvir sempre que é melhor switch-case, no lugar de if-else. E isto está certo, mas em partes.

Isso porque em um bloco if-else cascateado, o compilador irá verificar em cada condição até achar a correta. Por outro lado, nos blocos switch-case “supostamente” (veremos isto a diante) se executa a instrução correta e segue em frente.

Primeira técnica de otimização: Mantenha valores próximos e pequenos para o case.

Na verdade, muitas vezes, as declarações switch-case também são transformadas em “if-else” pelos compiladores. Isso acontece quando os valores do case são muitos distantes e/ou são distribuídos por uma gama bastante grande. Se você tem uma instrução switch-case pequena como no exemplo abaixo, então o compilador vai gerar uma tabela de salto em vez de um “if-else”.


  switch (a)
 {
   case 0: / * faz algo * /
   case 1: / * faz algo * /
   case 2: / * faz algo * /
   case 3: / * faz algo * /
   default:
 } 

Uma tabela de salto é como uma “tabela de pesquisa” ou uma “tabela de expedição”. Você pode supor que o compilador cria um array interno de endereços. O array é indexado pelos valores do case em que o índice é o endereço de instruções, correspondentes a esse case.

Segunda técnica de otimização: Coloque no inicio os cases mais prováveis

Como vimos acima, as declarações switch-case também podem gerar o mesmo efeito do if-else. Então se isto acontecer, devemos seguir o que teria sido melhor no caso do if-else, ou seja, manter no inicio as condições que possam ser satisfeitas (ou verdadeira) na maioria dos casos. Isto porque, se criar um efeito “if-else”, quanto mais rápido a condição satisfatória seja encontrada, menor será o desvio que o nosso código terá que executar.

Terceira técnica de otimização: Switch-case alinhado

Esta característica do switch-case de virar um “if-else” é bastante dependente da implementação do compilador e, portanto, sua implementação pode variar de compilador, podendo não assumir a forma de “if-else”. Mas não se preocupe, podemos tentar evitar isto. Você pode simular o mesmo comportamento da segunda técnica criando switch-cases alinhados. A ideia é que seja qual for a aplicação, o case “default” sempre será a ultima condição no “if-else”. Então, aproveitando isso, colocamos as opções mais frequentes nos poucos cases no nível superior e os demais cases colocamos em um switch-case alinhado no case default. Por exemplo, se temos 6 cases de 1 a 6 e os que podem ocorrer com mais frequência são os valores de 1 a 3, então podemos criar algo como o que é mostrado abaixo:


  switch (a)
 {
   case 1: / * faz algo * /
   case 2: / * faz algo * /
   case 3: / * faz algo * /
   default:
     switch (a)
     {
       case 4: / * faz algo * /
       case 5: / * faz algo * /
       case 6: / * faz algo * /
       default: / * faz algo * /
     }
 } 

Estas técnicas funcionam em qualquer linguagens que implementam o switch-case. Aplique-as e veja os benefícios.

Fonte: http://www.treinaweb.com.br/ler-artigo/24/otimizando-instrucoes-switch-case

Deixe um comentário