Skip to content

Instantly share code, notes, and snippets.

@eltonvs
Created June 23, 2017 14:12
Show Gist options
  • Save eltonvs/9d001a508775804ce41e90cde52f2ccd to your computer and use it in GitHub Desktop.
Save eltonvs/9d001a508775804ce41e90cde52f2ccd to your computer and use it in GitHub Desktop.

Revisions

  1. eltonvs created this gist Jun 23, 2017.
    92 changes: 92 additions & 0 deletions desempenho_otimizacao_software.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,92 @@
    # Desempenho e Otimização de Software

    ## Desempenho de software
    Geralmente negligenciado pelos desenvolvedores devido a:
    - Falta de experiência
    - Crença na alta capacidade da plataforma subjacente
    - Postergação para etapas posteriores ao desenvolvimento propriamente dito
    - Inerente complexidade e controvérsia

    ## Precisa levar em consideração
    - Antendimento **preciso e satisfatório** a requisitos funcionais e não funcionais
    - projeto estrutural e comportamental
    - implementação e/ou escolha de estruturas de dados e algoritmos
    - interaçãoes com a plataforma (hardware + SO) subjacente
    - questões de compilação e execução

    ## Program Optimization
    É o processo de modificação de um sistema de software para torná-lo mais
    eficiente ou utilizar menos recursos em algum aspecto. Em geral, um programa de
    compudator deve ser otimizado de forma que execute mais rapidamente, ou que
    seja capaz de operar com uma utilização menor de memória ou outros recursos,
    ou diminuir o uso da bateria.

    De maneira geral, uma otimização incui identificar possíveis ou reais gargalos
    no sistema que estejam prejudicando seu desempenho e tentar desfazê-los

    - Pode ocorrer em diversos níveis
    - Em projetos de maior longevidade, pode ser realizada em ciclos
    - Se muito postergada, pode incorrer em mudanças significativas ou mesmo uma
    reescrita completa do código (nem sempre pode ser alcançada nas fases finais
    do desenvolvimento)

    ### Níveis de otimização
    - Arquitetura e projeto detalhado
    - Algoritmos e estruturas de dados
    - Código fonte
    - Construção (building)
    - Compilação
    - Montagem (assembly)
    - Execução (otimização dinamica)

    ### Falácias
    - Reduzir linhas de código em linguagem de programação de alto nível -> otimiza
    - Algumas operações são provavelmente mais rápidas que outras
    - A otimização deve ser feita durante a codificação
    - Um programa rápido é tão importante quanto um programa correto
    - Problemas de desempenho são raros
    - Recursos computacionais são de fácil e barata aquisição
    - Dá muito trabalho fazer otimização
    - Dá pra otimizar depois

    ## Trade-offs
    Otimizar um programa pode
    - Tornar sua compreensão mais complicada
    - Torná-lo propenso a erros
    - Reduzir manutenibilidade
    - Prejudicar outros aspectos de qualidade
    - Ser algo muito prematuro
    - Representar uma tarefa não trivial por demandar uma análise precisa de
    desempenho

    ## Estratégia para otimização de código
    - Fazer um backup da versão atual do programa
    - Realizar medições para identificar gargalos de desempenho
    - Determinar a causa do problema de desempenho
    - Planejar como a otimização será feita e verificar eventuais efeitos
    - Realizar as modificações necessárias
    - Realizar novas medições para verificar se o gargalo foi resolvido
    - Identificar se as modificações não foram mais prejudiciais que benéficas
    - Realizar testes para verificar se n foram introduzidos bugs

    ## Técnicas para otimização de código
    - As técnicas de otimização de código focam em ganhos de desempenho, que podem
    ser alcançados mediante modificações no código fonte
    - A otimização de código diz respeito a alterações de menor escala, não a
    alterações de projeto, de maior impacto
    - Manipulação lógica de estuturas condicionais e de repetição
    - Aglomeração ou desdobramento de laços (em laços aninhados, o laço executado
    mais vezes deve ser o mais interno)
    - Transformações de dados (tipos adequados ao domínio, tipagem de acordo com a
    utilização real, evitando castings)

    ## Resumo
    - O desempenho é apenas um aspecto da qualidade geral do software, mas
    geralmente não é o mais importante.
    - Realizar medições quantitativas é fundamental para endereçar a questão de
    desempenho
    - Normalmente são necessárias múltiplas iterações para de obter as melhorias de
    desempenho desejadas por meio da otimização de código
    - A melhor maneira de se preparar para o trabalho de otimização durante a
    codificação inicial é escrever um código claro, compreensível e de fácil
    manutenibilidade