Skip to content

perf: Дорогая операция gc.get_referrers в _resolve_real_name (требуется кеширование) #4

@Alexandr153

Description

@Alexandr153

📌 Проблема

В RawEventDispatcher используется функция _resolve_real_name, которая пытается получить "реальное" имя функции через обход gc.get_referrers:

for obj in gc.get_referrers(code):

Данная операция:

  • дорогая по времени выполнения
  • выполняется на каждом событии трассировки
  • работает в hot-path

🎯 Цель

Уменьшить накладные расходы на получение имени функции.

💡 Предлагаемое решение

Добавить кеш:

code -> resolved_name

Пример
self._code_name_cache: dict[CodeType, str]

И использовать:

if code in self._code_name_cache:
    return self._code_name_cache[code]

🏗️ Предлагаемые изменения

  1. добавить кеш в RawEventDispatcher
  2. кешировать результат _resolve_real_name
  3. использовать кеш перед вызовом gc.get_referrers
  4. сохранять результат после вычисления

⚠️ Особенности

  • code объекты hashable → можно использовать как ключ
  • кеш не требует очистки (lifetime совпадает с программой)
  • важно не сломать поддержку декоратора @trace

📈 Ожидаемый результат

  • снижение нагрузки на GC
  • ускорение обработки событий
  • более стабильная производительность на больших трассировках

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions