Новичок
- Статус
- Не в сети
- Рег
- 7 Окт 2026
- Посты
- 3
- Реакции
- 0
Проблема «тяжелого» фронтенда при обработке больших массивов данных
Недавно столкнулся с задачей, которая на первый взгляд кажется тривиальной: вывод мониторинга состояния 50 000+ объектов в реальном времени. Стандартный подход с JS-фреймворками и отрисовкой через DOM-дерево просто «вешал» браузер из-за избыточных перерисовок (reflow). Решил пересмотреть архитектуру и вынести часть логики формирования представления на сторону сервера, используя связку C++, PHP и чистый CSS.Этап 1: Высокопроизводительный бэкенд на C++Основная идея: мы не гоним сырой JSON на клиент, чтобы потом мучительно его парсить и вставлять, а подготавливаем структуру данных так, чтобы браузеру оставалось только применить стили.
Для первичной обработки потока данных с датчиков используем C++. Здесь важно минимизировать аллокации памяти. Я использовал
std::vector с предварительным reserve(), чтобы собирать пакеты данных перед отправкой в Redis. Это позволяет избежать фрагментации при циклической перезаписи состояний.Этап 2: PHP как эффективный агрегатор
На стороне PHP мы забираем данные из кэша. Чтобы не плодить тысячи объектов, используем генераторы. Это критично для памяти: мы итерируемся по записям, не загружая весь массив в RAM. В процессе формирования HTML-разметки я наткнулся на интересную деталь оптимизации буферизации вывода, о чем писал в своем блоге — вот
Гости не видят ссылку
Войти или зарегистрироваться
механизма работы с ob_start и чанками.Реализация сетки через CSS Grid
Вместо классических таблиц<table>, которые крайне медленно рендерятся при динамическом изменении контента, я перешел на CSS Grid Layout. Это позволило достичь следующих результатов:- Virtual Scrolling: мы отрисовываем только видимую область, а Grid позволяет сохранять правильные отступы без создания пустых DOM-узлов.
- Снижение вложенности: отсутствие тегов
<tr>и<td>уменьшает размер HTML-документа почти в 2.5 раза. - Адаптивность: перестроение колонок происходит на уровне GPU, не затрагивая основной поток выполнения скриптов.
Код:
.monitor-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 2px;
contain: content;
}
contain: content; здесь обязательно. Оно сообщает браузеру, что содержимое элемента не влияет на геометрию других частей страницы, что радикально ускоряет перерисовку при обновлении статусов объектов.- Сбор данных на C++ и запись в Redis через пайплайны.
- PHP-скрипт формирует плоский список
<div>с минимальным набором data-атрибутов. - CSS Grid берет на себя всю работу по позиционированию.
will-change для слоев, которые обновляются чаще всего.крайсточка6710438
