TDC2013 Otimizando-C

245 visualizações

Publicada em

Apresentação no TDC2013 - Florianópolis da trilha Mobile e Embedded (25/05/2013). Apresenta algumas dicas, técnicas e sugestões de como melhorar o processamento e uso de memória no código.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
245
No SlideShare
0
A partir de incorporações
0
Número de incorporações
8
Ações
Compartilhamentos
0
Downloads
7
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

TDC2013 Otimizando-C

  1. 1. Globalcode – Open4educationOtimizando-C
  2. 2. Globalcode – Open4educationSumáriowhoamiOtimização?! WTF!?#define X constAritméticaCondiçõesLaços
  3. 3. Globalcode – Open4educationSumário (2)AlocaçãoParâmetrosrand()Fronteira finalBora otimizar então! #sqn
  4. 4. Globalcode – Open4educationwhoamiOsmar da Cunha FilhoFormado em Engenharia de Computação (UNIVALI)Pós-graduado em Desenvolvimento de ProdutosEletrônicos (IFSC)Coordenador de desenvolvimento de Hardware (Specto)Professor nos cursos de Ciências da Computação (IES)e Engenharia Civil (IES)
  5. 5. Globalcode – Open4educationOtimização!? WTF!?Otimizarv.t.d. Ocasionar circunstâncias mais proveitosas para; retiraro que há de melhor em; aprimorar, melhorar: otimizar odesenvolvimento do produto; otimizar as condições detrabalho.Dar a (algo, uma máquina, uma empresa) um rendimentoótimo, criando-lhe as condições mais favoráveis ou tirando(dele ou dela) o melhor partido possível; tornar (algo) ótimoou ideal.Estatística. Instituir o maior valor de uma grandeza.Informática. Aperfeiçoar um programa para que o mesmoseja melhor utilizado ou funcione mais rapidamente.Fonte: http://www.dicio.com.br/otimizar/
  6. 6. Globalcode – Open4educationOtimização!? WTF!?Melhorar performanceDiminuir consumo de recursosTempoProcessamentoEspaçoMemória
  7. 7. Globalcode – Open4educationOtimização!? WTF!?TradeoffProcessamentoMemóriaLegibilidadeComplexidade
  8. 8. Globalcode – Open4education#define X constMacros (#define) são resolvidas em tempo decompilaçãoConsts NEM SEMPRE são resolvidas em tempode compilaçãoAlguns compiladores as traduzem para #defines#defines são substituídas à medida que o códigovai sendo lido pelo compiladorConsts geram código e consomem memória deprograma
  9. 9. Globalcode – Open4educationAritméticaMultiplicação/DivisãoPotência de dois2, 4, 8, 16, 32, 64, 128, 25621, 22, 23, 24, 25, 26, 27, 28Multiplicações/Divisões por potências de dois sãorotações de bitsRotações de bits são operações lógicas!Operações lógicas são mais rápidas quearitméticas porque não possuem sinal!
  10. 10. Globalcode – Open4educationAritméticaMultiplicação/DivisãoMultiplicaçãox << 1x << 2x << 3x << 4Divisãox >> 1x >> 2x >> 3x >> 4x * 21x * 22x * 23x * 24x / 21x / 22x / 23x / 24
  11. 11. Globalcode – Open4educationCondiçõesCurto-circuitoCurto-circuito ou avaliação preguiçosa (lazyevaluation)Sempre em um if de múltiplas condiçõessimultâneas, colocar a condição mais fácil de sertestada antes, de forma que as condiçõesseguintes nem cheguem a ser testadasA ideia é sair o quanto antes
  12. 12. Globalcode – Open4educationCondiçõesCurto-circuitoif ( a < 0 && funcaoQueCalcula() > 10)if ( !b && j > 10)
  13. 13. Globalcode – Open4educationCondiçõesEliminar “senão”Pode ser menos custoso executar uma operação edesfazê-la com próprio ifElimina algumas instruções referentes ao um saltocondicional
  14. 14. Globalcode – Open4educationCondiçõesEliminar “senão”// Exemplo antesif (condicao) {executaCasoSe();}else {executaCasoSenao();}// Exemplo depoisexecutaCasoSenao();if (condicao) {desfazCasoSenao();executaCasoSe()}// Exemplo antesif (condicao) {variavel = 0;}else {variavel++;}// Exemplo depoisvariavel++;if (condicao) {variavel = 0;}
  15. 15. Globalcode – Open4educationLaçosLoop jammingLoop jammingAgrupar códigos que irão repetir em um laço sóPrincipalmente se forem repetidas pela mesmaquantidade de vezes
  16. 16. Globalcode – Open4educationLaçosLoop jamming// Exemplo antesfor ( i = 0; i < 100;i++ ){fazAlgo();}for ( i = 0; i < 100;i++ ){fazOutraCoisa();}// Exemplo depoisfor (i = 0; i < 100;i++ ){fazAlgo();fazOutraCoisa();}
  17. 17. Globalcode – Open4educationLaços++ X --Em vez de contadores progressivos até o limitemáximo, utilizar contadores regressivosterminando em zeroAlgumas arquiteturas possuem instruções quetestam condição de zero após decrementar
  18. 18. Globalcode – Open4educationLaços++ X --// Incremementandofor ( i = 0; i < 100 ; i++)// O laco tem que comparar com um valor != 0i – 100 == 0 ?i++ e continua// Decrementandofor ( i = 100; i-- ; )// O laco tem que testar uma flag de zero da ULAi == 0 ?i-- e continua
  19. 19. Globalcode – Open4educationPara não chamar amesma funçãoinúmeras vezes,passando comoparâmetro umcontador, criar umafunção com o contadorinternamenteLaçosContador como parâmetro// Calcula passando parametroi (antes)for (i = 0; i < 100; i++) {calcula(x,i);}// Modificando a funcao paracalcular dentro do laco(depois)void calcula (x) {for(i = 0; i < 100; i++) {//calcula no laço}}
  20. 20. Globalcode – Open4educationLaçosFimO laço precisa mesmo ir até o final?Ele pode sair antes e retornar o valor?Por exemplo em uma pesquisa de elementos!for (i = 0 ; i < 100 ; i++ ) {if (arrayExemplo[i] == 100 ) {encontrado = i;break;}}
  21. 21. Globalcode – Open4educationLaçosLoop unrollingDesenrolar laços depoucas repetiçõesO compilador nãoprecisa definir aestrutura pararepetição nem calcularíndices// Antesfor ( i = 0 ; i < 3; i++ ){arrayExemplo[i] = 2*i;}// DepoisarrayExemplo[0] = 0;arrayExemplo[1] = 2;arrayExemplo[2] = 4;
  22. 22. Globalcode – Open4educationLaçosIterativo X RecursivoPreferir algoritmos iterativos a recursivosPode causar estouro de pilhaAumenta a passagem de parâmetrosCuidado ao chamar funções no tratamento deinterrupções!
  23. 23. Globalcode – Open4educationAlocaçãoLocal X GlobalO compilador pode alocar variáveis locaisdiretamente em registrador ou na pilhaVariáveis globais vão para a memória (RAM) e porisso pode ser necessário mais bytes de endereçopara acessá-la
  24. 24. Globalcode – Open4educationAlocaçãoTipos de dados - TamanhoUtilizar o tipo mais adequado ao problemachar, int, long?float, double?Operações com ponto flutuante demoram mais queoperações em tipos inteirosConsultar a unidade de ponto flutuante (FPU)!
  25. 25. Globalcode – Open4educationAlocaçãoTamanhoNa dúvida, use a bitagem da arquitetura!Em PCs x86, int é mais rápido que char e shortChar e short precisam ser reduzidos!Int é padrão da arquitetura (seja ela 32 ou 64 bits)!Em microcontroladores 8 bits, char é mais rápidoUnsigned char é mais rápido ainda
  26. 26. Globalcode – Open4educationAlocaçãosigned X unsignedTipos sem sinal são mais rápidosunsigned char, unsigned int, unsigned longTipos com sinal passam por circuitos a mais naULA para estender o sinalNúmero sem sinal: bit mais significativo é zeroNúmero com sinal: bit mais significativo é um
  27. 27. Globalcode – Open4education(Extensão de sinal)Complemento de dois-1281000 0000-641100 0000+640011 1111+1270111 11112551111 11111270111 1111630011 1111310001 1111
  28. 28. Globalcode – Open4educationAlocaçãoInicialização X AtribuiçãoÉ preferível inicializar já com o valor do queapenas declarar e inicializar depoisAo inicializar na declaração, não há dois distintosmomentos (alocação e atribuição), ao alocar ocompilador já atribui o valor!
  29. 29. Globalcode – Open4educationAlocaçãoInicialização X Atribuição// InicializacaoTipo variavel = valor;// Declaracao e atribuicaoTipo variavel;...variavel = valor;
  30. 30. Globalcode – Open4educationAlocaçãoArrays X PonteirosEm vez de usar arrays e índices, utilizar ponteiros!Utilizando arrays, para acessar o índice nLer o endereço base do arrayLer nSomar endereço base com nAcessar o endereço calculado
  31. 31. Globalcode – Open4educationAlocaçãoArrays X PonteirosUsando ponteiros:Apontar o ponteiro para o início do arraySomar o índice ao ponteiroAritmética de ponteiros! :DRecalcular os índices deixa de ser repetida a cadaiteraçãoPara varrer listas (uso comum), o ponteiro éincrementado em somente uma unidade (INC)
  32. 32. Globalcode – Open4educationAlocaçãoArrays X Ponteiros// Antesint arrayTeste[100];for (i = 0; i < 100;i++){arrayTeste[i] = 0;}// Depoisint arrayTeste[100];int *ponteiroArray;ponteiroArray =&arrayTeste[0];for (i = 0; i < 100; i++) {*ponteiroArray = 0;ponteiroArray++;}
  33. 33. Globalcode – Open4educationAlocaçãoArrays multidimensionaisLocalidade de referênciaValor ou local de armazenamento frequentementeacessadoLocalidade de referência espacialLocais de armazenamento próximosArrays multidmensionais serão alocados em umamemória unidimensional
  34. 34. Globalcode – Open4educationAlocaçãoArrays multidimensionaisAtenção à ordem dos índices!Acessar:arrayTeste [ i ][ j ]arrayTeste [ i ] [ j + 1]é melhor que:arrayTeste [ i + 1 ] [ j ]
  35. 35. Globalcode – Open4educationAlocaçãoAlinhamento (padding)// Cabe em 20 bytes:struct exemplo {int a;char b;int c;char d;int e;}// Cabe em 16 bytes:struct exemplo {int a;int c;int e;char b;char d;}Alinhar o tipo a potências de 2!
  36. 36. Globalcode – Open4educationAlocaçãoCampos de bits (bitfields)Para otimizar uso dememória paraarmazenar um valorbooleano, pode-seutilizar campos de bitsstruct campoDeBits {unsigned bit0: 1;unsigned bit1: 1;unsigned bit2: 1;unsigned bit3: 1;unsigned bit4: 1;unsigned bit5: 1;unsigned bit6: 1;unsigned bit7: 1;}
  37. 37. Globalcode – Open4educationAlocaçãoCampos de bits (bitfields)Alguns cuidados com os campos de bits:Os bits não são endereçáveis diretamente (pelooperador &), somente pela struct (no exemplo,campoDeBits.bit0)Custa mais processamento ler um bit do que umunsigned charExige operações de teste bit a bit
  38. 38. Globalcode – Open4educationParâmetrosDependendo da arquitetura, os primeirosparâmetros (4 para x86) são passados porregistradoresOs parâmetros seguintes são passados pela pilhaOu seja, além do quarto parâmetro, custa aindamais acessar os parâmetrosOperações de acesso à pilha
  39. 39. Globalcode – Open4educationParâmetrosÉ preferível passar structs por referência em vezde por valorAssim não há a cópia da struct toda pararegistradores/pilha
  40. 40. Globalcode – Open4educationParâmetrosDiminuir a quantidade de parâmetros utilizandovariáveis globaisMuitas funções precisando de um mesmo dadoEvita estouros de pilha!
  41. 41. Globalcode – Open4educationParâmetrosUtilizar referência em vez de ponteirosReferências nunca são NULLCódigo mais limpo (sem inúmeros *)
  42. 42. Globalcode – Open4educationrand()F**K OPTIMIZINGQuando não se quer que o compilador otimize umavariável, basta declará-la como volatilevolatile unsigned char variavel;Útil em casos que a variável é compartilhadaInterrupçõesTimersThreads
  43. 43. Globalcode – Open4educationrand()Isso está otimiza(n)do?Conferir o código geradoAssembly listingArquivos intermediários de compilação.MAP.LST.S
  44. 44. Globalcode – Open4educationFronteira final!?Otimização pelo compiladorAnálise de algoritmo (big-O)Buscar outros algoritmosOtimizar em Assembly.
  45. 45. Globalcode – Open4educationBora otimizar, então! #sqnNão adianta otimizar o que ESTÁ ERRADO!Primeiro preocupar-se com a corretudeGarantir a legibilidade do códigoÉ tão necessário transformar tudo em ponteiros em#defines?
  46. 46. Globalcode – Open4educationBora otimizar, então! #sqnDonald Knuthpremature optimization is the root of all evilTio BenWith great powers come great responsabilities
  47. 47. Globalcode – Open4educationPerguntas?Dúvidas?Reclamações?Sugestões?Questões existenciais?
  48. 48. Globalcode – Open4educationOsmar da Cunha Filho@oooosmar (4 letras “o”)
  49. 49. Globalcode – Open4educationObrigado!:D

×