Основы 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-инженеры идентифицируют узкие места и валидируют улучшения с измеримыми метриками.