Fundamentos Performance Profiling

Performance profiling identifica cuellos de botella en uso CPU, asignación memoria, I/O red y consultas base de datos.

Áreas Clave Profiling

  • CPU Profiling - Identificar rutas código calientes consumiendo ciclos CPU
  • Memory Profiling - Encontrar asignaciones memoria y fugas
  • I/O Profiling - Detectar operaciones disco y red lentas
  • Database Profiling - Optimizar consultas y connection pooling

CPU Profiling

Node.js CPU Profiling

# Profiler integrado
node --prof app.js

# Generar reporte legible
node --prof-process isolate-0x*.log > profile.txt

# Usar clinic flame
npm install -g clinic
clinic flame -- node app.js

Python CPU Profiling

import cProfile

def slow_function():
    total = 0
    for i in range(1000000):
        total += i
    return total

# Profilear ejecución
cProfile.run('slow_function()', 'output.prof')

Flame Graphs

# Capturar stack traces
perf record -F 99 -p <PID> -g -- sleep 30

# Generar flame graph
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg

Memory Profiling

Node.js

const v8 = require('v8');

function takeHeapSnapshot(filename) {
    v8.writeHeapSnapshot(filename);
}

takeHeapSnapshot('./heap-snapshot.heapsnapshot');

Python

from memory_profiler import profile

@profile
def memory_intensive():
    large_list = [i for i in range(1000000)]
    return len(large_list)

Database Query Profiling

PostgreSQL

-- Explain query plan
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

-- Añadir índice
CREATE INDEX idx_users_email ON users(email);

Estrategias Optimización

Optimización CPU

# Antes: O(n²)
def find_duplicates_slow(arr):
    for i in range(len(arr)):
        for j in range(i + 1, len(arr)):
            if arr[i] == arr[j]:
                duplicates.append(arr[i])

# Después: O(n)
def find_duplicates_fast(arr):
    seen = set()
    duplicates = set()
    for item in arr:
        if item in seen:
            duplicates.add(item)
        seen.add(item)
    return list(duplicates)

Conclusión

Performance profiling transforma conjeturas en optimización basada en datos. Perfilando sistemáticamente CPU, memoria, red y rendimiento base de datos, ingenieros QA identifican cuellos de botella y validan mejoras con métricas medibles.