Optimización y Depuración
Estrategias de Optimización
Niveles de Optimización
graph TD
A[Niveles de Optimización de GCC] --> B[-O0: Sin Optimización]
A --> C[-O1: Optimización Básica]
A --> D[-O2: Optimización Recomendada]
A --> E[-O3: Optimización Agresiva]
Ejemplo de Optimización de Rendimiento
// 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 Optimizado
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;
}
Comparación de Optimización
| Flag de Optimización |
Tiempo de Compilación |
Rendimiento del Código |
Tamaño del Binario |
| -O0 |
Más rápido |
Menor |
Menor |
| -O1 |
Rápido |
Moderado |
Pequeño |
| -O2 |
Moderado |
Bueno |
Medio |
| -O3 |
Más lento |
Mejor |
Mayor |
Técnicas de Depuración
Depuración con GDB
## Compilar con símbolos de depuración
gcc -g program.c -o program_debug
## Iniciar la depuración
gdb ./program_debug
Comandos GDB Comunes
| Comando |
Descripción |
break main |
Establecer punto de interrupción en la función principal |
run |
Iniciar la ejecución del programa |
next |
Ejecutar la siguiente línea |
print variable |
Imprimir el valor de la variable |
backtrace |
Mostrar la pila de llamadas |
Depuración de Memoria
#include <stdlib.h>
void memory_leak_example() {
int *ptr = malloc(sizeof(int) * 10);
// Falta free(ptr)
}
Análisis de Memoria con Valgrind
## Instalar Valgrind
sudo apt-get install valgrind
## Comprobación de memoria
valgrind --leak-check=full ./program
Perfilado de Rendimiento
Herramientas de Perfilado
## Compilar con perfilado
gcc -pg program.c -o program_profile
## Generar datos de perfil
./program_profile
gprof program_profile gmon.out
Sanitizadores del Compilador
Sanitizador de Direcciones
## Compilar con Sanitizador de Direcciones
gcc -fsanitize=address -g program.c -o program_sanitized
Sanitizador de Comportamiento Indefinido
## Compilar con Sanitizador de Comportamiento Indefinido
gcc -fsanitize=undefined -g program.c -o program_ub
Consejos de Optimización para LabEx
- Usar niveles de optimización apropiados
- Habilitar advertencias del compilador
- Usar herramientas de depuración y perfilado
- Probar diferentes estrategias de optimización
Técnicas de Optimización Avanzadas
Funciones Inline
// Sugerir al compilador que inline
static inline int max(int a, int b) {
return (a > b) ? a : b;
}
Desplegado de Bucles
// Desplegado manual de bucles
for (int i = 0; i < 100; i += 4) {
process(arr[i]);
process(arr[i+1]);
process(arr[i+2]);
process(arr[i+3]);
}
Dominando estas técnicas de optimización y depuración, los desarrolladores pueden crear programas C más eficientes y confiables en plataformas como LabEx.