Одна простая идея, чтобы улучшить производительность в 50 раз.
Платон однажды сказал: «Дайте мне точку опоры, и я переверну Землю». Эта мысль о силе рычага вдохновляла многих, в том числе и Бакминстера Фуллера, который развил эту идею в концепцию «Тримтаб». Вот что он сказал об этом:
Однажды меня сильно поразила мысль о том, что может сделать один маленький человек. Вспомните "Куин Мэри" — мимо проплывает весь корабль, а затем появляется руль. И на краю руля есть крошечная штучка, называемая Тримтабом.
Это миниатюрный руль. Просто двигая этот маленький тримтаб, создается небольшое давление, которое поворачивает руль. Это почти не требует усилий. Поэтому я сказал, что даже маленький человек может быть «тримтабом». Обществу кажется, что оно проходит мимо вас, что оно вас совсем оставило. Но если вы мыслите динамично, то факт в том, что вы можете просто сделать шаг вперед, и весь большой государственный корабль полетит.
Поэтому я сказал: называйте меня Тримтабом.
Эта идея Фуллера о том, что маленькие действия могут привести к большим изменениям, вдохновила нас в нашем проекте. У нас была функция для перетаскивания объектов по экрану. Когда объектов становилось много, всё начинало нереально тормозить. И тут мы подумали: "А что, если мы найдем свой тримтаб в коде? Ту маленькую деталь, которая может сильно улучшить работу всей системы?"
Это заставило нас по-новому взглянуть на нашу задачу. Вместо того чтобы полностью переписывать код, мы стали искать небольшие, но стратегически важные места для улучшений. Мы искали наш программный «тримтаб», который мог бы повернуть всю систему к лучшей производительности.
И вот что мы сделали:
1. Нашли узкие места, разобрав процесс перетаскивания, и поняли, что наибольшая нагрузка приходится на постоянную перерисовку элементов и обновление состояния.
2. Нашли точки с большим рычагом для оптимизации: вместо полного пересмотра системы рендеринга, мы сосредоточились на нескольких ключевых аспектах:
— Механизм отрисовки при перетаскивании
— Частота обновления состояния
— Обработка групп объектов
3. Сделали небольшие, но эффективные изменения:
— Использовали «двойную буферизацию» для рисования перетаскиваемых элементов. Рисуем движущиеся объекты на отдельном невидимом канвасе, а потом копируем его содержание в основной. Это намного быстрее, чем перерисовывать весь экран.
— Добавили механизм отложенного обновления (debounce), чтобы группировать множество мелких обновлений в одно более крупное. Это уменьшает количество перерисовок и обновлений состояния.
— Уменьшили количество пересчетов при обновлении состояния через мемоизацию. Запоминаем результаты сложных вычислений и переиспользуем их, если входные данные не изменились. Это значительно сокращает время на повторяющиеся операции.
— Внедрили систему кэширования и повторного использования данных. Храним последние состояния объектов и их трансформации, чтобы не пересчитывать их каждый раз заново. Это особенно эффективно при работе с большим количеством объектов.
— Оптимизировали обработку множественных объектов через пакетное обновление. Вместо обновления каждого объекта по отдельности, группируем изменения и применяем их одним махом. Этим в разы снизили нагрузку на сеть при массовых операциях.
Вся эта магия вместе дала нам супер-быстрое перетаскивание объектов и показатели сравнимые (или даже лучше) с Miro. И знаешь что самое крутое? Мы не переписывали всю логику с нуля. Мы просто постоянно искали правильные маленькие рычажки — наши программные тримтабы.
Этот опыт научил нас важному уроку: в мире разработки, как и в жизни, маленькие действия могут приводить к большим результатам. Концепция «тримтаба» применима не только к кораблям или коду, но и к любой сложной системе. Возможно, решение многих глобальных проблем также кроется в небольших, но стратегически важных изменениях.
А какие «тримтабы» вы находили в своей жизни для решения сложных проблем?