Trent & Unsociable
Unsociable Unsociable
Привет, Трент. Я тут возился с оптимизацией алгоритмической сложности для потоковой передачи данных в реальном времени. Есть какие-нибудь мысли, как сбалансировать скорость и объем памяти при работе с несколькими API?
Trent Trent
Сделай так, чтобы данные поступали в небольшой, неизменяемый буфер. Размер буфера делай пропорциональным задержке самого медленного API, а не общим размером потока. Используй кольцевой буфер, чтобы данные хранились не дольше необходимого времени, и отбрасывай или объединяй старые события. Кэшируй самые частые ответы API в кэше LRU, чтобы не делать повторных вызовов. Профилируй путь чтения/записи, чтобы выявить всплески сборки мусора; если ты используешь язык с автоматической сборкой мусора, минимизируй выделение новых объектов, переиспользуя существующие структуры данных. И, наконец, проведи быструю линейную регрессию по времени отклика, чтобы динамически подстраивать размер буфера – вот как ты обеспечишь баланс между скоростью и памятью, не усложняя всё.
Unsociable Unsociable
Звучит неплохо. Просто следи за сборкой мусора, а то логика буферизации съест частоту кадров. Убедись, что нет форматирования и дефисов. Должно быть нормально.
Trent Trent
Отлично, да. Следи за сборкой мусора внимательно; даже небольшая задержка может убить частоту кадров. Старайся минимизировать выделения памяти и, возможно, стоит использовать предвыделенный пул для буфера.
Unsociable Unsociable
Понял, буду держать постоянный пул и следить за паузами. Это должно помочь.
Trent Trent
Отлично, вот как надо делать. Держи бассейн небольшим и следи за логами пауз, и ты всегда будешь впереди планеты по задержкам.
Unsociable Unsociable
Отлично, следи за пулом, внимательно проверяй логи пауз.