TDC2013 Otimizando-C

  • 121 views
Uploaded on

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.

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
121
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
5
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Globalcode – Open4educationOtimizando-C
  • 2. Globalcode – Open4educationSumáriowhoamiOtimização?! WTF!?#define X constAritméticaCondiçõesLaços
  • 3. Globalcode – Open4educationSumário (2)AlocaçãoParâmetrosrand()Fronteira finalBora otimizar então! #sqn
  • 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. 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. Globalcode – Open4educationOtimização!? WTF!?Melhorar performanceDiminuir consumo de recursosTempoProcessamentoEspaçoMemória
  • 7. Globalcode – Open4educationOtimização!? WTF!?TradeoffProcessamentoMemóriaLegibilidadeComplexidade
  • 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. 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. 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. 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. Globalcode – Open4educationCondiçõesCurto-circuitoif ( a < 0 && funcaoQueCalcula() > 10)if ( !b && j > 10)
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Globalcode – Open4education(Extensão de sinal)Complemento de dois-1281000 0000-641100 0000+640011 1111+1270111 11112551111 11111270111 1111630011 1111310001 1111
  • 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. Globalcode – Open4educationAlocaçãoInicialização X Atribuição// InicializacaoTipo variavel = valor;// Declaracao e atribuicaoTipo variavel;...variavel = valor;
  • 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. 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. 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. 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. Globalcode – Open4educationAlocaçãoArrays multidimensionaisAtenção à ordem dos índices!Acessar:arrayTeste [ i ][ j ]arrayTeste [ i ] [ j + 1]é melhor que:arrayTeste [ i + 1 ] [ j ]
  • 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. 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. 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. 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. 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. Globalcode – Open4educationParâmetrosDiminuir a quantidade de parâmetros utilizandovariáveis globaisMuitas funções precisando de um mesmo dadoEvita estouros de pilha!
  • 41. Globalcode – Open4educationParâmetrosUtilizar referência em vez de ponteirosReferências nunca são NULLCódigo mais limpo (sem inúmeros *)
  • 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. Globalcode – Open4educationrand()Isso está otimiza(n)do?Conferir o código geradoAssembly listingArquivos intermediários de compilação.MAP.LST.S
  • 44. Globalcode – Open4educationFronteira final!?Otimização pelo compiladorAnálise de algoritmo (big-O)Buscar outros algoritmosOtimizar em Assembly.
  • 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. Globalcode – Open4educationBora otimizar, então! #sqnDonald Knuthpremature optimization is the root of all evilTio BenWith great powers come great responsabilities
  • 47. Globalcode – Open4educationPerguntas?Dúvidas?Reclamações?Sugestões?Questões existenciais?
  • 48. Globalcode – Open4educationOsmar da Cunha Filho@oooosmar (4 letras “o”)
  • 49. Globalcode – Open4educationObrigado!:D