Otimização e Depuração
Estratégias de Otimização
Níveis de Otimização
graph TD
A[Níveis de Otimização do GCC] --> B[-O0: Sem Otimização]
A --> C[-O1: Otimização Básica]
A --> D[-O2: Otimização Recomendada]
A --> E[-O3: Otimização Agressiva]
Exemplo de Otimização de Desempenho
// Código Ineficiente
int calculate_sum(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
// Código Otimizado
int optimized_sum(int arr[], int size) {
int sum1 = 0, sum2 = 0;
for (int i = 0; i < size; i += 2) {
sum1 += arr[i];
sum2 += arr[i+1];
}
return sum1 + sum2;
}
Comparação de Otimização
| Flag de Otimização |
Tempo de Compilação |
Desempenho do Código |
Tamanho do Binário |
| -O0 |
Mais Rápido |
Menor |
Menor |
| -O1 |
Rápido |
Moderado |
Pequeno |
| -O2 |
Moderado |
Bom |
Médio |
| -O3 |
Mais Lento |
Melhor |
Maior |
Técnicas de Depuração
Depuração com GDB
## Compilar com símbolos de depuração
gcc -g program.c -o program_debug
## Iniciar a depuração
gdb ./program_debug
Comandos GDB Comuns
| Comando |
Descrição |
break main |
Definir ponto de interrupção na função principal |
run |
Iniciar a execução do programa |
next |
Executar a próxima linha |
print variável |
Imprimir o valor da variável |
backtrace |
Mostrar a pilha de chamadas |
Depuração de Memória
#include <stdlib.h>
void memory_leak_example() {
int *ptr = malloc(sizeof(int) * 10);
// Falta free(ptr)
}
Análise de Memória com Valgrind
## Instalar Valgrind
sudo apt-get install valgrind
## Verificação de vazamentos de memória
valgrind --leak-check=full ./program
Profiling de Desempenho
Ferramentas de Profiling
## Compilar com profiling
gcc -pg program.c -o program_profile
## Gerar dados de perfil
./program_profile
gprof program_profile gmon.out
Sanitizers do Compilador
Address Sanitizer
## Compilar com Address Sanitizer
gcc -fsanitize=address -g program.c -o program_sanitized
Undefined Behavior Sanitizer
## Compilar com Undefined Behavior Sanitizer
gcc -fsanitize=undefined -g program.c -o program_ub
Dicas de Otimização LabEx
- Utilize níveis de otimização apropriados
- Habilite avisos do compilador
- Utilize ferramentas de depuração e profiling
- Teste diferentes estratégias de otimização
Técnicas de Otimização Avançadas
Funções Inline
// Sugerir ao compilador para inline
static inline int max(int a, int b) {
return (a > b) ? a : b;
}
Desdobramento de Loop
// Desdobramento manual de loop
for (int i = 0; i < 100; i += 4) {
process(arr[i]);
process(arr[i+1]);
process(arr[i+2]);
process(arr[i+3]);
}
Dominando essas técnicas de otimização e depuração, os desenvolvedores podem criar programas C mais eficientes e confiáveis em plataformas como LabEx.