SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Globalcode – Open4education
Otimizando-C
Globalcode – Open4education
Sumário
whoami
Otimização?! WTF!?
#define X const
Aritmética
Condições
Laços
Globalcode – Open4education
Sumário (2)
Alocação
Parâmetros
rand()
Fronteira final
Bora otimizar então! #sqn
Globalcode – Open4education
whoami
Osmar da Cunha Filho
Formado em Engenharia de Computação (UNIVALI)
Pós-graduado em Desenvolvimento de Produtos
Eletrônicos (IFSC)
Coordenador de desenvolvimento de Hardware (Specto)
Professor nos cursos de Ciências da Computação (IES)
e Engenharia Civil (IES)
Globalcode – Open4education
Otimização!? WTF!?
Otimizar
v.t.d. Ocasionar circunstâncias mais proveitosas para; retirar
o que há de melhor em; aprimorar, melhorar: otimizar o
desenvolvimento do produto; otimizar as condições de
trabalho.
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) ótimo
ou ideal.
Estatística. Instituir o maior valor de uma grandeza.
Informática. Aperfeiçoar um programa para que o mesmo
seja melhor utilizado ou funcione mais rapidamente.
Fonte: http://www.dicio.com.br/otimizar/
Globalcode – Open4education
Otimização!? WTF!?
Melhorar performance
Diminuir consumo de recursos
Tempo
Processamento
Espaço
Memória
Globalcode – Open4education
Otimização!? WTF!?
Tradeoff
Processamento
Memória
Legibilidade
Complexidade
Globalcode – Open4education
#define X const
Macros (#define) são resolvidas em tempo de
compilação
Consts NEM SEMPRE são resolvidas em tempo
de compilação
Alguns compiladores as traduzem para #defines
#defines são substituídas à medida que o código
vai sendo lido pelo compilador
Consts geram código e consomem memória de
programa
Globalcode – Open4education
Aritmética
Multiplicação/Divisão
Potência de dois
2, 4, 8, 16, 32, 64, 128, 256
21
, 22
, 23
, 24
, 25
, 26
, 27
, 28
Multiplicações/Divisões por potências de dois são
rotações de bits
Rotações de bits são operações lógicas!
Operações lógicas são mais rápidas que
aritméticas porque não possuem sinal!
Globalcode – Open4education
Aritmética
Multiplicação/Divisão
Multiplicação
x << 1
x << 2
x << 3
x << 4
Divisão
x >> 1
x >> 2
x >> 3
x >> 4
x * 21
x * 22
x * 23
x * 24
x / 21
x / 22
x / 23
x / 24
Globalcode – Open4education
Condições
Curto-circuito
Curto-circuito ou avaliação preguiçosa (lazy
evaluation)
Sempre em um if de múltiplas condições
simultâneas, colocar a condição mais fácil de ser
testada antes, de forma que as condições
seguintes nem cheguem a ser testadas
A ideia é sair o quanto antes
Globalcode – Open4education
Condições
Curto-circuito
if ( a < 0 && funcaoQueCalcula() > 10)
if ( !b && j > 10)
Globalcode – Open4education
Condições
Eliminar “senão”
Pode ser menos custoso executar uma operação e
desfazê-la com próprio if
Elimina algumas instruções referentes ao um salto
condicional
Globalcode – Open4education
Condições
Eliminar “senão”
// Exemplo antes
if (condicao) {
executaCasoSe();
}
else {
executaCasoSenao();
}
// Exemplo depois
executaCasoSenao();
if (condicao) {
desfazCasoSenao();
executaCasoSe()
}
// Exemplo antes
if (condicao) {
variavel = 0;
}
else {
variavel++;
}
// Exemplo depois
variavel++;
if (condicao) {
variavel = 0;
}
Globalcode – Open4education
Laços
Loop jamming
Loop jamming
Agrupar códigos que irão repetir em um laço só
Principalmente se forem repetidas pela mesma
quantidade de vezes
Globalcode – Open4education
Laços
Loop jamming
// Exemplo antes
for ( i = 0; i < 100;
i++ )
{
fazAlgo();
}
for ( i = 0; i < 100;
i++ )
{
fazOutraCoisa();
}
// Exemplo depois
for (i = 0; i < 100;
i++ )
{
fazAlgo();
fazOutraCoisa();
}
Globalcode – Open4education
Laços
++ X --
Em vez de contadores progressivos até o limite
máximo, utilizar contadores regressivos
terminando em zero
Algumas arquiteturas possuem instruções que
testam condição de zero após decrementar
Globalcode – Open4education
Laços
++ X --
// Incremementando
for ( i = 0; i < 100 ; i++)
// O laco tem que comparar com um valor != 0
i – 100 == 0 ?
i++ e continua
// Decrementando
for ( i = 100; i-- ; )
// O laco tem que testar uma flag de zero da ULA
i == 0 ?
i-- e continua
Globalcode – Open4education
Para não chamar a
mesma função
inúmeras vezes,
passando como
parâmetro um
contador, criar uma
função com o contador
internamente
Laços
Contador como parâmetro
// Calcula passando parametro
i (antes)
for (i = 0; i < 100; i++) {
calcula(x,i);
}
// Modificando a funcao para
calcular dentro do laco
(depois)
void calcula (x) {
for(i = 0; i < 100; i++) {
//calcula no laço
}
}
Globalcode – Open4education
Laços
Fim
O 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;
}
}
Globalcode – Open4education
Laços
Loop unrolling
Desenrolar laços de
poucas repetições
O compilador não
precisa definir a
estrutura para
repetição nem calcular
índices
// Antes
for ( i = 0 ; i < 3; i++ )
{
arrayExemplo[i] = 2*i;
}
// Depois
arrayExemplo[0] = 0;
arrayExemplo[1] = 2;
arrayExemplo[2] = 4;
Globalcode – Open4education
Laços
Iterativo X Recursivo
Preferir algoritmos iterativos a recursivos
Pode causar estouro de pilha
Aumenta a passagem de parâmetros
Cuidado ao chamar funções no tratamento de
interrupções!
Globalcode – Open4education
Alocação
Local X Global
O compilador pode alocar variáveis locais
diretamente em registrador ou na pilha
Variáveis globais vão para a memória (RAM) e por
isso pode ser necessário mais bytes de endereço
para acessá-la
Globalcode – Open4education
Alocação
Tipos de dados - Tamanho
Utilizar o tipo mais adequado ao problema
char, int, long?
float, double?
Operações com ponto flutuante demoram mais que
operações em tipos inteiros
Consultar a unidade de ponto flutuante (FPU)!
Globalcode – Open4education
Alocação
Tamanho
Na dúvida, use a bitagem da arquitetura!
Em PCs x86, int é mais rápido que char e short
Char e short precisam ser reduzidos!
Int é padrão da arquitetura (seja ela 32 ou 64 bits)!
Em microcontroladores 8 bits, char é mais rápido
Unsigned char é mais rápido ainda
Globalcode – Open4education
Alocação
signed X unsigned
Tipos sem sinal são mais rápidos
unsigned char, unsigned int, unsigned long
Tipos com sinal passam por circuitos a mais na
ULA para estender o sinal
Número sem sinal: bit mais significativo é zero
Número com sinal: bit mais significativo é um
Globalcode – Open4education
(Extensão de sinal)
Complemento de dois
-128
1000 0000
-64
1100 0000
+64
0011 1111
+127
0111 1111
255
1111 1111
127
0111 1111
63
0011 1111
31
0001 1111
Globalcode – Open4education
Alocação
Inicialização X Atribuição
É preferível inicializar já com o valor do que
apenas declarar e inicializar depois
Ao inicializar na declaração, não há dois distintos
momentos (alocação e atribuição), ao alocar o
compilador já atribui o valor!
Globalcode – Open4education
Alocação
Inicialização X Atribuição
// Inicializacao
Tipo variavel = valor;
// Declaracao e atribuicao
Tipo variavel;
...
variavel = valor;
Globalcode – Open4education
Alocação
Arrays X Ponteiros
Em vez de usar arrays e índices, utilizar ponteiros!
Utilizando arrays, para acessar o índice n
Ler o endereço base do array
Ler n
Somar endereço base com n
Acessar o endereço calculado
Globalcode – Open4education
Alocação
Arrays X Ponteiros
Usando ponteiros:
Apontar o ponteiro para o início do array
Somar o índice ao ponteiro
Aritmética de ponteiros! :D
Recalcular os índices deixa de ser repetida a cada
iteração
Para varrer listas (uso comum), o ponteiro é
incrementado em somente uma unidade (INC)
Globalcode – Open4education
Alocação
Arrays X Ponteiros
// Antes
int arrayTeste[100];
for (i = 0; i < 100;
i++)
{
arrayTeste[i] = 0;
}
// Depois
int arrayTeste[100];
int *ponteiroArray;
ponteiroArray =
&arrayTeste[0];
for (i = 0; i < 100; i++) {
*ponteiroArray = 0;
ponteiroArray++;
}
Globalcode – Open4education
Alocação
Arrays multidimensionais
Localidade de referência
Valor ou local de armazenamento frequentemente
acessado
Localidade de referência espacial
Locais de armazenamento próximos
Arrays multidmensionais serão alocados em uma
memória unidimensional
Globalcode – Open4education
Alocação
Arrays multidimensionais
Atenção à ordem dos índices!
Acessar:
arrayTeste [ i ][ j ]
arrayTeste [ i ] [ j + 1]
é melhor que:
arrayTeste [ i + 1 ] [ j ]
Globalcode – Open4education
Alocação
Alinhamento (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!
Globalcode – Open4education
Alocação
Campos de bits (bitfields)
Para otimizar uso de
memória para
armazenar um valor
booleano, pode-se
utilizar campos de bits
struct 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;
}
Globalcode – Open4education
Alocação
Campos de bits (bitfields)
Alguns cuidados com os campos de bits:
Os bits não são endereçáveis diretamente (pelo
operador &), somente pela struct (no exemplo,
campoDeBits.bit0)
Custa mais processamento ler um bit do que um
unsigned char
Exige operações de teste bit a bit
Globalcode – Open4education
Parâmetros
Dependendo da arquitetura, os primeiros
parâmetros (4 para x86) são passados por
registradores
Os parâmetros seguintes são passados pela pilha
Ou seja, além do quarto parâmetro, custa ainda
mais acessar os parâmetros
Operações de acesso à pilha
Globalcode – Open4education
Parâmetros
É preferível passar structs por referência em vez
de por valor
Assim não há a cópia da struct toda para
registradores/pilha
Globalcode – Open4education
Parâmetros
Diminuir a quantidade de parâmetros utilizando
variáveis globais
Muitas funções precisando de um mesmo dado
Evita estouros de pilha!
Globalcode – Open4education
Parâmetros
Utilizar referência em vez de ponteiros
Referências nunca são NULL
Código mais limpo (sem inúmeros *)
Globalcode – Open4education
rand()
F**K OPTIMIZING
Quando não se quer que o compilador otimize uma
variável, basta declará-la como volatile
volatile unsigned char variavel;
Útil em casos que a variável é compartilhada
Interrupções
Timers
Threads
Globalcode – Open4education
rand()
Isso está otimiza(n)do?
Conferir o código gerado
Assembly listing
Arquivos intermediários de compilação
.MAP
.LST
.S
Globalcode – Open4education
Fronteira final!?
Otimização pelo compilador
Análise de algoritmo (big-O)
Buscar outros algoritmos
Otimizar em Assembly.
Globalcode – Open4education
Bora otimizar, então! #sqn
Não adianta otimizar o que ESTÁ ERRADO!
Primeiro preocupar-se com a corretude
Garantir a legibilidade do código
É tão necessário transformar tudo em ponteiros em
#defines?
Globalcode – Open4education
Bora otimizar, então! #sqn
Donald Knuth
premature optimization is the root of all evil
Tio Ben
With great powers come great responsabilities
Globalcode – Open4education
Perguntas?
Dúvidas?
Reclamações?
Sugestões?
Questões existenciais?
Globalcode – Open4education
Osmar da Cunha Filho
@oooosmar (4 letras “o”)
Globalcode – Open4education
Obrigado!
:D

Contenu connexe

Tendances

mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasdiogoa21
 
Algoritmos e Estrutura de Dados - Aula 03
Algoritmos e Estrutura de Dados - Aula 03Algoritmos e Estrutura de Dados - Aula 03
Algoritmos e Estrutura de Dados - Aula 03thomasdacosta
 
Programando em python excecoes
Programando em python   excecoesProgramando em python   excecoes
Programando em python excecoessamuelthiago
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaodiogoa21
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsLeonardo Melo Santos
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos João moreira
 
Conceitos e técnicas de programação lista de exercícios i
Conceitos e técnicas de programação lista de exercícios iConceitos e técnicas de programação lista de exercícios i
Conceitos e técnicas de programação lista de exercícios iRobson Ferreira
 
Algoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosAlgoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosMauro Pereira
 
Introdução ao Octave
Introdução ao OctaveIntrodução ao Octave
Introdução ao OctavePeslPinguim
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlabblogmaxima
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programaçãorodfernandes
 

Tendances (20)

mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicas
 
Algoritmos - Procedimentos
Algoritmos - ProcedimentosAlgoritmos - Procedimentos
Algoritmos - Procedimentos
 
Algoritmos e Estrutura de Dados - Aula 03
Algoritmos e Estrutura de Dados - Aula 03Algoritmos e Estrutura de Dados - Aula 03
Algoritmos e Estrutura de Dados - Aula 03
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Java aula 05
Java aula 05Java aula 05
Java aula 05
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
Aula 5 algoritimos(continuacao)
Aula 5   algoritimos(continuacao)Aula 5   algoritimos(continuacao)
Aula 5 algoritimos(continuacao)
 
Programando em python excecoes
Programando em python   excecoesProgramando em python   excecoes
Programando em python excecoes
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacao
 
Vhdl
VhdlVhdl
Vhdl
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos
 
Conceitos e técnicas de programação lista de exercícios i
Conceitos e técnicas de programação lista de exercícios iConceitos e técnicas de programação lista de exercícios i
Conceitos e técnicas de programação lista de exercícios i
 
Algoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosAlgoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmos
 
Introdução ao Octave
Introdução ao OctaveIntrodução ao Octave
Introdução ao Octave
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlab
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 
Complexidade Ciclomática
Complexidade CiclomáticaComplexidade Ciclomática
Complexidade Ciclomática
 
Algoritimo - Raul
Algoritimo - RaulAlgoritimo - Raul
Algoritimo - Raul
 

Similaire à TDC2013 Otimizando-C

Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônicaFabio Souza
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Codificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadosCodificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadoshenriqueprossi
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptxLuanDev1
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Giovanni Bassi
 
ASP.Net Módulo 2
ASP.Net   Módulo 2ASP.Net   Módulo 2
ASP.Net Módulo 2michellobo
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoIntel Software Brasil
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Práticatdc-globalcode
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na PráticaEiti Kimura
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETJorge Maia
 

Similaire à TDC2013 Otimizando-C (20)

Curso de java 02
Curso de java 02Curso de java 02
Curso de java 02
 
Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Codificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcadosCodificação segura em C para sistemas embarcados
Codificação segura em C para sistemas embarcados
 
Aula 3-lógica.pptx
Aula 3-lógica.pptxAula 3-lógica.pptx
Aula 3-lógica.pptx
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Aula 1 | Introdução a C++
Aula 1 | Introdução a C++Aula 1 | Introdução a C++
Aula 1 | Introdução a C++
 
Aula3
Aula3Aula3
Aula3
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptx
 
Aula2
Aula2Aula2
Aula2
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6
 
ASP.Net Módulo 2
ASP.Net   Módulo 2ASP.Net   Módulo 2
ASP.Net Módulo 2
 
Visualg
VisualgVisualg
Visualg
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorização
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Parte1c
Parte1cParte1c
Parte1c
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Prática
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NET
 

TDC2013 Otimizando-C