Сценарий 06: Анализ производительности

Инженер по производительности выявляет узкие места и возможности для оптимизации.

Быстрый старт

# Выберите сценарий производительности
/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

Связанные сценарии