o:otimizacao
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
o:otimizacao [2022/08/30 15:40] – [Exemplos de otimização do código (em linguagem C)] Seijiro Yanagiya Midzuno | o:otimizacao [2022/09/05 22:37] (atual) – Bruno Lima | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Otimização ====== | ||
+ | Em qualquer área científica ou tecnológica, | ||
+ | |||
+ | |||
+ | ====== Otimização computacional ====== | ||
+ | |||
+ | Na área computacional, | ||
+ | A otimização do código pode ser feita manualmente pelo desenvolvedor ou automaticamente pelo compilador/ | ||
+ | * A otimização não deve, de forma alguma, modificar o significado do programa. Em outras palavras, o programa original não pode ter seu âmago alterado; | ||
+ | * A otimização deve trazer melhorias ao programa original seguindo algum critério (velocidade de execução, espaço de armazenamento ocupado, etc.). Não há sentido em otimizar um programa e torná-lo “pior” em relação ao seu estado pré-otimizado; | ||
+ | * O tempo de compilação deve ser razoável. | ||
+ | | ||
+ | |||
+ | ====== Porque otimizar ====== | ||
+ | ---- | ||
+ | A otimização do programa é viável pois: | ||
+ | * Reduz o espaço consumido pelo programa e aumenta a velocidade de execução; | ||
+ | * Geralmente, um algoritmo otimizado permite a sua reutilização em outras situações/ | ||
+ | * Diminui drasticamente o tempo de algumas atividades, como por exemplo, uma análise manual de uma quantidade consideravelmente grande de dados demanda muito tempo. Sendo assim, nesse caso, pode ser utilizado o software Tableau (desenvolvido para análise de dados). De forma semelhante, a própria otimização manual de um código grande demanda muito tempo e possui uma confiabilidade inferior a softwares otimizadores. | ||
+ | |||
+ | Além disso, essa técnica normalmente ocorre durante a finalização do desenvolvimento do programa pois ela tende a dificultar a legibilidade e aumentar o tamanho do código, em troca pelas melhorias de desempenho. | ||
+ | |||
+ | |||
+ | ====== Tipos de otimização ====== | ||
+ | ---- | ||
+ | Podemos classificar, | ||
+ | |||
+ | ==== Otimização independente da máquina ==== | ||
+ | Tem como objetivo melhorar o código intermediário (tradução da linguagem programada para uma linguagem do compilador que facilita sua leitura e manipulação, | ||
+ | |||
+ | ==== Otimização dependente da máquina ==== | ||
+ | Diferentemente da otimização independente da máquina, nesse caso, a otimização ocorre após o compilador gerar o código de máquina. Sendo assim, haverá registros no processador e também referências de memória absoluta, pois ter acesso à essas informações possibilita a otimização de uma forma diferente à apresentada anteriormente. Otimizadores dependentes da máquina têm por objetivo tirar o máximo proveito da hierarquia de memória. | ||
+ | | ||
+ | ====== Exemplos de otimização do código (em linguagem C) ====== | ||
+ | ---- | ||
+ | - Propagação de variável: nesse caso, é possível observar que a variável ‘x’ é utilizada apenas como referência para o valor de ‘a’. Entretanto, como não há alteração no valor de ‘a’, essa atribuição não faz diferença para a operação com a variável ‘b’. | ||
+ | <code javascript> | ||
+ | //Antes da Otimização | ||
+ | c = a * b; | ||
+ | x = a; | ||
+ | d = x * b + 4; | ||
+ | |||
+ | //Depois da Otimização | ||
+ | c = a * b; | ||
+ | x = a; | ||
+ | d = a + 4; | ||
+ | </ | ||
+ | - Eliminação de código morto: Muitas vezes, a propagação de variável gera um código inalcançável ou indiferente para o programa. Utilizando o mesmo exemplo acima, podemos otimizar ainda mais eliminando a variável ‘x’, uma vez que ambos não fazem diferença para o código. | ||
+ | <code javascript> | ||
+ | //Antes da Otimização | ||
+ | c = a * b; | ||
+ | x = a; | ||
+ | d = a * b + 4; | ||
+ | |||
+ | //Depois da Otimização | ||
+ | c = a * b; | ||
+ | d = c + 4; | ||
+ | </ | ||
+ | |||
+ | |||
+ | - Code Motion: Visa reduzir a frequência de avaliação da expressão e também retirar variáveis constantes de dentro de loops. | ||
+ | |||
+ | <code javascript> | ||
+ | //Antes da Otimização | ||
+ | a = 200; | ||
+ | while (a > 0) { | ||
+ | b = x + y; | ||
+ | if (a % b == 0} // resto da divisão de ‘a’ por ‘b’ é 0 | ||
+ | printf(“%d”, | ||
+ | } | ||
+ | |||
+ | //Depois da Otimização | ||
+ | a = 200; | ||
+ | b = x + y; | ||
+ | while(a> | ||
+ | if (a % b == 0} // resto da divisão de ‘a’ por ‘b’ é 0 | ||
+ | printf(“%d”, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== Aplicação da otimização ====== | ||
+ | |||
+ | A otimização pode ser aplicada em três momentos (programa de origem, código intermediário e código de máquina) e dividida em duas fases (Otimização global e Otimização local). | ||
+ | ===== Momentos ===== | ||
+ | * Programa de origem:\\ | ||
+ | A otimização ocorre no programa de origem e envolve realizar modificações na lógica do algoritmo ou na estrutura dos laços de repetição. A otimização nesse momento é feita pelo próprio desenvolvedor. | ||
+ | |||
+ | * Código Intermediário: | ||
+ | A otimização ocorre no programa intermediário e envolve realizar modificações nos cálculos de endereço de memória e também transformações nas chamadas de procedimentos. Nessa fase, a otimização é feita pelo compilador. | ||
+ | |||
+ | * Código de máquina:\\ | ||
+ | Feita também pelo compilador, são feitas alterações em uma parte mais baixo nível do código. Como por exemplo o uso de registradores do processador. | ||
+ | |||
+ | ===== Fases ===== | ||
+ | |||
+ | * Otimização global:\\ | ||
+ | Alterações ocorrem em grandes conjuntos do programa, como por exemplo funções, laços de repetições e procedimentos. | ||
+ | |||
+ | * Otimização local:\\ | ||
+ | Alterações ocorrem em pequenos conjuntos do código, como em linhas específicas do programa. Essa, por sua vez, ocorre anteriormente à otimização global. | ||
+ | |||
+ | |||
+ | ====== Referências ====== | ||
+ | ---- | ||
+ | |||
+ | [1] OPTIMIZING Compiler. In: **WIKIPÉDIA**: | ||
+ | |||
+ | [2] RANGEL, José Lucas. **Otimização de Código**. [Material de apoio à disciplina de Compiladores, | ||
+ | |||
+ | [3] RICARTE, I. L. M.. **Otimização de Código**. [Material de apoio às disciplinas de Introdução a Software de Sistema e Mini e microcomputadores: |