Основы Performance Profiling

Performance profiling идентифицирует узкие места в использовании CPU, выделении памяти, сетевом I/O и запросах к базе данных.

Ключевые Области Profiling

  • CPU Profiling - Идентифицировать горячие пути кода, потребляющие циклы CPU
  • Memory Profiling - Находить выделения памяти и утечки
  • I/O Profiling - Обнаруживать медленные операции диска и сети
  • Database Profiling - Оптимизировать запросы и connection pooling

CPU Profiling

Node.js CPU Profiling

# Встроенный profiler
node --prof app.js

# Генерация читаемого отчета
node --prof-process isolate-0x*.log > profile.txt

# Использование 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

# Профилирование выполнения
cProfile.run('slow_function()', 'output.prof')

Flame Graphs

# Захват stack traces
perf record -F 99 -p <PID> -g -- sleep 30

# Генерация 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';

-- Добавить индекс
CREATE INDEX idx_users_email ON users(email);

Стратегии Оптимизации

Оптимизация CPU

# До: 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])

# После: 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)

Заключение

Performance profiling трансформирует догадки в оптимизацию, основанную на данных. Систематически профилируя CPU, память, сеть и производительность базы данных, QA-инженеры идентифицируют узкие места и валидируют улучшения с измеримыми метриками.