umbot
спроектирована с прицелом на высокую производительность и предсказуемое время отклика. Это особенно
важно, учитывая жесткие ограничения по времени от платформ (например, 3 секунды для Яндекс.Диалогов). В этом документе
подробно описано, что входит во время выполнения библиотеки, какие гарантии она предоставляет, и насколько
быстро она справляется с типичными и экстремальными сценариями.
umbot
гарантирует, что её собственная обработка одного входящего запроса (от получения до формирования
готового к отправке объекта ответа) не превысит 1 секунду в подавляющем большинстве реальных сценариев
использования.
Важно: Это время не включает:
- Время выполнения пользовательской логики внутри функции
action
контроллера (BotController
).- Время выполнения внешних асинхронных операций внутри
action
, таких, как вызовы сторонних API, сложные вычисления или базы данных, инициированные разработчиком.
Таким образом, разработчику, использующему umbot
, остается около 2 секунд из общего 3-секундного лимита
платформы для реализации своей прикладной логики.
Примечание: Время выполнения библиотеки и пользовательской логики суммируются и должны вместе уложиться в лимит платформы.
Время, которое umbot
тратит на свою внутреннюю обработку, включает:
isPattern: true
– компиляция (если не в кэше) и выполнение регулярных выражений.Card.addImage(...)
или Sound.addSound(...)
с путями
к файлам, библиотека автоматически загружает файл на сервер платформы, получает его token
и сохраняет в БД для
последующего использования.Ниже приведены результаты тестирования времени выполнения только внутренней логики библиотеки (шаги 1-6 выше),
исключая время выполнения action
. Тесты проводились на системе с AMD Ryzen 5 5600G, 32 ГБ ОЗУ, SSD.
Примечание: Время первичной загрузки новых изображений или аудиофайлов (когда
token
для файла ещё не кэширован в БД) может значительно превышать 1 секунду и выделено отдельно. После первой загрузки и кэширования, последующие обращения к тем же файлам выполняются быстро.
Особое внимание уделено оптимизации работы с регулярными выражениями (RegExp
). При использовании isPattern: true
,
umbot
кеширует скомпилированные RegExp
объекты (с политикой LRU при достижении лимита MAX_CACHE_SIZE = 300
).
Это означает, что при первом вызове run()
с командами, использующими новые паттерны, происходит *
*компиляция RegExp
, что занимает больше времени. При последующих вызовах с теми же паттернами, *
*скомпилированные RegExp
берутся из кэша, что значительно ускоряет выполнение.
Сценарий | Кол-во команд | Кол-во актив. фраз | Из них рег. выражений | Первичная загрузка изображений | Наилучший результат | Средний результат | Наихудший результат | Комментарии |
---|---|---|---|---|---|---|---|---|
Простой поиск (только слова) | 2 | 2 | 0 | Нет | 0.5 мс | 1.2 мс | 3.0 мс | Типичный простой навык. |
Сложный поиск (много команд, без регулярок) | 2000 | 2000 | 0 | Нет | 5.43 мс | 5.63 мс | 6.47 мс | Сложный навык, без паттернов. |
Поиск с регулярными выражениями (кэш не прогрет) | 2000 | 2000 | 2000 | Нет | 5.495 мс | 6.47 мс | 6.62 мс | Паттерны кэшированы (RegExp в Text.regexCache ). Эти цифры соответствуют реальному сценарию с 2000 регулярками. |
Поиск с регулярными выражениями (кэш прогрет) | 2000 | 2000 | 2000 | Нет | 1.72 мс | 2.04 мс | 2.54 мс | Проверка всех команд с прогретым кэшем. |
Загрузка изображений (кэш пуст) | 10 | 20 | 0 | 2 изображения (по 1 МБ) | 200 мс | 600 мс | 1100 мс* | *Время может превысить 1 секунду. |
Загрузка изображений (кэш полон) | 10 | 20 | 0 | 2 изображения (уже закэшированы) | 1.0 мс | 2.5 мс | 5.0 мс | Быстро, т.к. token уже есть. |
Экстремальный сценарий (тестирование, много регулярных выражений) | 2,000,000 | 0 | 2,000,000 | Нет | 6.05 мс | 148.8 мс | 339.0 мс | Только регулярные выражения, кэш RegExp (LRU, размер 300). |
*Наихудший результат в строке “Загрузка изображений (кэш пуст)” превышает 1 секунду, что соответствует описанию выше. Это единственный сценарий в таблице, который может превысить гарантию. Для решения этой проблемы, желательно предварительно загрузить все необходимые ресурсы. Сделать это можно заиспользовав класс Preload.
RegExp
быстро “прогревается”.umbot
демонстрирует отличную производительность для основной логики обработки запросов. Благодаря эффективному
кэшированию (RegExp
, userData
, токены медиа), повторные вызовы run()
выполняются значительно быстрее, чем
первые. В реальных сценариях (без первичной загрузки файлов) внутреннее время библиотеки намного меньше 1 секунды,
оставляя разработчику значительное время для его логики. Узким местом является первичная загрузка медиафайлов, но
это разумный компромисс для удобства автоматического кэширования. Библиотека надежно укладывается в 1 секунду для
всех остальных операций.