Сценарий 06: Анализ производительности¶
Инженер по производительности выявляет узкие места и возможности для оптимизации.
Быстрый старт¶
# Выберите сценарий производительности
/select 06
Анализ сложности¶
Поиск «горячих» функций¶
> Найти функции с наибольшей цикломатической сложностью
╭─────────────── Отчёт по сложности ───────────────────────────╮
│ │
│ Топ-10 самых сложных функций: │
│ │
│ # Функция Сложность Строки Файл │
│ ─────────────────────────────────────────────────────────── │
│ 1 exec_simple_query 47 234 postgres.c│
│ 2 ExecInitNode 32 189 execProc..│
│ 3 parse_analyze 28 156 analyze.c │
│ 4 standard_ProcessUtility 26 312 utility.c │
│ 5 heap_insert 24 178 heapam.c │
│ │
│ Средняя сложность: 8.4 │
│ Функций со сложностью > 20: 23 │
│ Функций со сложностью > 30: 5 │
│ │
╰──────────────────────────────────────────────────────────────╯
Обнаружение глубокой вложенности¶
> Найти функции с глубокой вложенностью циклов
╭─────────────── Анализ вложенности ───────────────────────────╮
│ │
│ Функции с глубиной вложенности > 4: │
│ │
│ 🔴 join_search_one_level() глубина: 6 │
│ Расположение: src/backend/optimizer/path/joinrels.c:89 │
│ Паттерн: Тройная вложенность циклов с условиями │
│ Влияние: O(n³) в худшем случае │
│ │
│ 🟡 ExecHashJoinImpl() глубина: 5 │
│ Расположение: src/backend/executor/nodeHashjoin.c:234 │
│ Паттерн: Вложенный цикл с логикой повтора │
│ │
│ Рекомендации по оптимизации доступны для 12 функций │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ памяти¶
Паттерны выделения памяти¶
> Найти функции, выделяющие большой объём памяти
╭─────────────── Анализ выделения памяти ─────────────────────╮
│ │
│ Функции с высоким выделением памяти: │
│ │
│ Функция Выделения Контекст │
│ ────────────────────────────────────────────────────────────│
│ ExecHashTableCreate palloc x 15 HashMemoryContext │
│ MakeTupleTableSlot palloc x 8 Per-tuple │
│ BuildTupleHashTable palloc x 12 HashMemoryContext │
│ │
│ Горячие точки контекстов памяти: │
│ - HashMemoryContext: 45% выделений │
│ - MessageContext: 23% выделений │
│ - PortalContext: 18% выделений │
│ │
│ Рекомендация: Проверить использование HashMemoryContext │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ частоты вызовов¶
Горячие пути¶
> Найти часто вызываемые функции при выполнении запроса
╭─────────────── Анализ частоты вызовов ──────────────────────╮
│ │
│ Горячие функции (по количеству вызовов на типичный запрос): │
│ │
│ Функция Вызовов/запрос Кумулятивно │
│ ────────────────────────────────────────────────────────────│
│ slot_getattr ~10 000 Внутренний цикл │
│ ExecQual ~5 000 Фильтрация строк │
│ ExecProject ~2 500 Проекция │
│ ExecProcNode ~1 000 Диспетчеризация узлов│
│ │
│ Критический путь: │
│ ExecutorRun → ExecProcNode → ExecScan → slot_getattr │
│ │
│ Фокус оптимизации: Функции внутреннего цикла │
│ │
╰──────────────────────────────────────────────────────────────╯
Алгоритмические паттерны¶
O(n²) и хуже¶
> Найти потенциальные паттерны O(n²)
╭─────────────── Алгоритмическая сложность ───────────────────╮
│ │
│ Потенциально квадратичные паттерны: │
│ │
│ 🔴 list_member() в цикле │
│ Расположение: src/backend/catalog/dependency.c:456 │
│ Паттерн: Линейный поиск в цикле │
│ Решение: Использовать хеш-таблицу для проверки вхождения │
│ │
│ 🟡 bsearch во вложенном цикле │
│ Расположение: src/backend/optimizer/path/costsize.c:789 │
│ Паттерн: O(n log n) на итерацию │
│ Текущая сложность: O(n² log n) │
│ │
│ Найдено паттернов: 8 │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры запросов¶
- «Найти функции с высокой сложностью»
- «Показать горячие точки выделения памяти»
- «Найти паттерны O(n²)»
- «Какие функции вызываются чаще всего?»
- «Найти функции с глубокой вложенностью»
- «Показать критические пути выполнения»
Справочник метрик¶
| Метрика | Порог | Действие |
|---|---|---|
| Цикломатическая сложность | > 20 | Рассмотреть разделение функции |
| Глубина вложенности | > 4 | Рефакторинг циклов |
| Длина функции | > 200 строк | Выделить подфункции |
| Выделений памяти на вызов | > 10 | Проверить использование памяти |
Связанные сценарии¶
- Рефакторинг — Улучшение кода
- Технический долг — Индикаторы долга
- Отладка — Отладка производительности