26. Técnicas de ajuste de código
Lógica, laços, dados, expressões e rotinas: ajustes locais que precisam ser medidos um a um.
Resumo
- Lógica: pare de testar quando souber a resposta; teste o mais frequente primeiro; tabelas; avaliação preguiçosa.
- Laços: unswitching (if para fora), jamming (fundir laços), unrolling, sentinela, laço mais ativo por dentro.
- Redução de força: trocar operação cara por barata (multiplicação → soma). Minimize trabalho dentro do laço.
- Dados: inteiros em vez de floats, menos dimensões, cache, índices suplementares. Expressões: pré-calcule.
- Resultados variam por linguagem e compilador: o que ajuda num, piora noutro. Meça sempre.
Perguntas-chave
responda de cabeça, depois abraO que é unswitching?
Tirar de dentro do laço uma decisão que não muda durante ele, criando dois laços (um para cada caso).
O que é um valor sentinela?
Um valor colocado no fim da estrutura para que a busca pare sozinha, eliminando um teste por iteração.
Por que medir cada técnica?
Porque o mesmo ajuste dá ganho numa linguagem ou compilador e nenhum (ou perda) em outro.
Exercícios de fixação
0/5 respondidas1.
for (...) { if (tipo == SOMA) s += a[i]; else s -= a[i]; }, com tipo fixo no laço. Qual técnica se aplica?2.
Dois laços seguidos percorrem o mesmo array, um somando e outro achando o máximo. Juntá-los num só é:
3.
Trocar
x = i * 8 dentro de um laço por uma soma acumulada x += 8 é exemplo de:4.
Numa busca linear, colocar o valor procurado no fim do array para eliminar o teste de fim é:
5.
Uma técnica deu 40% de ganho em C++ e piorou o tempo em Java. O que o capítulo conclui?