Ferramentas do usuário

Ferramentas do site


o:otimizacao

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anteriorRevisão anterior
Pró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 Midzunoo:otimizacao [2022/09/05 22:37] (atual) Bruno Lima
Linha 1: Linha 1:
 +====== Otimização ======
  
 +Em qualquer área científica ou tecnológica, otimizar os projetos é quase indispensável. Buscando sempre uma economia de recursos (minimizando custos e riscos) ou um aumento na eficiência do projeto (maximizando lucros ou confiabilidade), a otimização nos dias atuais é essencial.
 +
 +
 +====== Otimização computacional ======
 +
 +Na área computacional, durante a fase de finalização de um código, a técnica de otimização é utilizada para transformar um programa, com o objetivo de minimizar o consumo de CPU e memória e, consequentemente, obter a melhor versão possível do programa no quesito tempo de execução, tamanho de armazenamento ou gasto energético.
 +A otimização do código pode ser feita manualmente pelo desenvolvedor ou automaticamente pelo compilador/software, mas deve seguir restritamente as seguintes condições:
 +  * 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/programas;
 +  * 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, de forma geral e ampla, a otimização em dois tipos: otimização independente da máquina e otimização dependente da máquina.
 +
 +==== 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, anterior ao código de máquina). Dessa forma, é possível obter um melhor código de máquina otimizado. Por conta da otimização ocorrer no código intermediário, não há nenhum registro do processador e nem referência ou localização absoluta da memória.
 +
 +==== 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;
 +</code>
 +  - 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>
 +
 +
 +  - 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”, a);
 +}
 +
 +//Depois da Otimização
 +a = 200;
 +b = x + y;
 +while(a>0) {
 + if (a % b == 0} // resto da divisão de ‘a’ por ‘b’ é 0
 + printf(“%d”, a);
 +}
 +</code>
 +
 +
 +====== 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**: a enciclopédia livre. Disponível em: <https://en.wikipedia.org/wiki/Optimizing_compiler>. Acesso em 4 de setembro de 2022.
 +
 +[2] RANGEL, José Lucas. **Otimização de Código**. [Material de apoio à disciplina de Compiladores, lecionada na Universidade Federal de Pernambuco]. Disponível em: <https://www.cin.ufpe.br/~mvpm/Compiladores/otim.pdf>. Acesso em 04 de setembro de 2022.
 +
 +[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: software]. Disponível em: <https://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node76.html>. Acesso em 04 de setembro.