Инженер по производительности выявляет узкие места и возможности для оптимизации.
Быстрый старт¶
# Выберите сценарий производительности
/select 06
Архитектура¶
Обработчик производительности использует 4 доменно-агностичных компонента:
| Компонент | Назначение |
|---|---|
| PerformanceProfiler | Обнаружение узких мест на основе шаблонов |
| CallGraphAnalyzer | Определение горячих точек через in-degree/out-degree графа вызовов |
| ResourceAnalyzer | Анализ использования ресурсов и влияния |
| OptimizationAdvisor | Приоритизированные рекомендации по оптимизации |
Специализированные обработчики в performance_handlers/ обеспечивают анализ: узких мест, горячих точек, сложности, памяти, параллелизма, кэша, ввода/вывода и инлайн-функций.
Примечание: Весь анализ доменно-агностичен. Имена функций, API управления памятью и языковые шаблоны загружаются из активного доменного плагина через
DomainRegistry. Примеры ниже используют кодовую базу C для иллюстрации — фактический вывод зависит от анализируемого проекта.
Анализ сложности¶
Поиск «горячих» функций¶
Обработчик запрашивает CPG для функций с высокой цикломатической сложностью (формула на основе CFG: M = E - N + 2) и высоким in-degree (наиболее вызываемые функции):
> Найти функции с наибольшей цикломатической сложностью
╭─────────────── Отчёт по сложности ───────────────────────────╮
│ │
│ Самые сложные функции (по цикломатической сложности): │
│ │
│ # Функция Сложность LOC Файл │
│ ─────────────────────────────────────────────────────────── │
│ 1 process_request 42 287 server.c │
│ 2 dispatch_command 31 195 cmd.c │
│ 3 parse_expression 27 163 parser.c │
│ 4 validate_input 25 312 input.c │
│ 5 build_index 22 178 index.c │
│ │
│ Порог: high_complexity = 20 │
│ Функций выше порога: 23 │
│ │
╰──────────────────────────────────────────────────────────────╯
Обнаружение глубокой вложенности¶
Глубина вложенности анализируется через цикломатическую сложность и структуру CFG:
> Найти функции с глубокой вложенностью
╭─────────────── Анализ вложенности ───────────────────────────╮
│ │
│ Функции с высокой вложенностью и сложностью: │
│ │
│ process_request() сложность: 42 │
│ Файл: src/server.c:89 │
│ Шаблон: Вложенные циклы с условными ветвлениями │
│ │
│ dispatch_command() сложность: 31 │
│ Файл: src/cmd.c:234 │
│ Шаблон: Switch с вложенными условиями │
│ │
│ Рекомендации по оптимизации доступны для 12 функций │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ графа вызовов¶
Горячие точки (In-Degree)¶
Обработчик определяет горячие функции с помощью статического анализа графа вызовов — подсчитывая количество уникальных вызывающих функций (in-degree) из таблицы edges_call CPG. Это структурная метрика, а не динамическое профилирование:
> Найти наиболее вызываемые функции
╭─────────────── Горячие точки графа вызовов ────────────────╮
│ │
│ Топ функций по In-Degree (количество вызывающих): │
│ │
│ Функция Вызывающих Роль │
│ ────────────────────────────────────────────────────────────│
│ validate_input 87 Утилита │
│ log_event 64 Логирование │
│ alloc_buffer 51 Память │
│ format_output 43 Форматирование │
│ │
│ Функции с высоким out-degree (вызывающие многих): │
│ process_request 34 вызываемых │
│ dispatch_command 28 вызываемых │
│ │
│ Метрики графа: PageRank, betweenness centrality │
│ │
╰──────────────────────────────────────────────────────────────╯
Критические пути¶
> Показать критические пути выполнения
╭─────────────── Анализ критических путей ──────────────────╮
│ │
│ Betweenness centrality определяет узкие функции, │
│ которые лежат на многих кратчайших путях графа вызовов: │
│ │
│ 1. dispatch_command → process_request → validate_input │
│ 2. main → init_server → load_config │
│ │
│ Функции с высоким betweenness — архитектурные │
│ горячие точки: их оптимизация даёт наибольший эффект. │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ памяти¶
Анализ памяти использует функции доменного плагина для поиска шаблонов выделения/освобождения. Конкретные API зависят от активного домена (например, malloc/free для C, palloc/pfree для PostgreSQL, new/delete для C++):
> Найти горячие точки выделения памяти
╭─────────────── Анализ выделения памяти ─────────────────────╮
│ │
│ Найдено функций управления памятью: 15 │
│ │
│ Функция Тип Файл │
│ ────────────────────────────────────────────────────────────│
│ alloc_buffer выделение memory.c │
│ free_buffer освобождение memory.c │
│ resize_pool переаллокация pool.c │
│ create_context контекст context.c │
│ │
│ Анализ включает: │
│ - Функции выделения (специфичные для домена) │
│ - Освобождение и очистку │
│ - Управление контекстами/пулами │
│ - Шаблоны переаллокации │
│ │
╰──────────────────────────────────────────────────────────────╯
Запросы алгоритмической сложности¶
Когда запрос содержит ключевые слова quadratic, O(n²), nested или cognitive, обработчик направляет к подобработчику сложности. Он объединяет данные цикломатической сложности с анализом функций памяти из доменного плагина для выявления функций с потенциально плохим масштабированием:
> Найти потенциальные шаблоны O(n²)
╭─────────────── Анализ на основе сложности ─────────────────╮
│ │
│ Функции с высокой сложностью (потенциальные проблемы │
│ масштабирования): │
│ │
│ process_request() сложность: 42 │
│ Высокая цикломатическая сложность указывает на │
│ вложенные циклы │
│ │
│ build_index() сложность: 22 │
│ Обнаружены множественные вложенные итерации │
│ │
│ Примечание: Анализ использует цикломатическую сложность │
│ и метрики графа вызовов как приближение к алгоритмической │
│ сложности. Рекомендуется ручная проверка для подтверждения │
│ шаблонов O(n²). │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры запросов¶
- «Найти функции с высокой сложностью»
- «Показать наиболее вызываемые функции»
- «Найти горячие точки выделения памяти»
- «Какие функции имеют наибольший in-degree?»
- «Найти функции с глубокой вложенностью»
- «Показать критические пути выполнения»
- «Найти потенциальные квадратичные шаблоны»
Справочник метрик¶
| Метрика | Порог | Источник |
|---|---|---|
| Цикломатическая сложность | > 20 | ThresholdConfig.high_complexity |
| Размер функции | > 500 строк | ThresholdConfig.loc_very_large |
| In-degree (вызывающих) | > 3 | ThresholdConfig.min_in_degree |
| Показатель влияния | > 0.7 | ThresholdConfig.high_impact |
Связанные сценарии¶
- Рефакторинг — Улучшение кода
- Технический долг — Индикаторы долга
- Отладка — Отладка производительности