От команды SyncGallery

От 100 000 файлов к миллиону

У каждого приложения есть число, под которое разработчики негласно его проектируют. У нас это было 100 000 файлов — пока не пришли реальные пользователи.

Галерея телефона, разрастающаяся в огромное поле упорядоченных миниатюр фото

Цель, которая казалась щедрой

Когда мы начинали создавать SyncGallery, мы выбрали чёткую цель по производительности: приложение должно оставаться быстрым при 100 000 медиафайлов на устройстве. Каждый алгоритм мы писали с учётом этого числа и тестировали на библиотеках примерно такого размера.

Тогда 100 000 файлов казались большим запасом. Если снимать по 30 фото в день каждый день, до этого числа придётся идти около девяти лет. Мы были уверены, что никто не будет хранить на телефоне больше.

Пользователи доказали, что мы ошибались

Вскоре после первого выпуска мы узнали, насколько ошибочным было это предположение. Реальные библиотеки оказались гораздо больше нашего потолка: архивы камеры за много лет, фото, перенесённые со старых телефонов и компьютеров, и целые семейные коллекции на больших картах памяти. Многие телефоны Android до сих пор поддерживают карты памяти на 512 ГБ и даже 1 ТБ — места хватит для библиотек, во много раз превышающих нашу изначальную цель.

Приложение не сломалось внезапно на 100 001-м файле — пределы производительности редко бывают такими вежливыми. Вместо этого операции, которые должны казаться мгновенными, стали выполняться заметно дольше, и чем больше библиотека выходила за пределы цели, тем хуже становилась работа. Для людей с самыми большими библиотеками — пожалуй, тех, кому приложение для резервного копирования нужнее всего, — этого было недостаточно.

Что меняется при десятикратном масштабе

Многие упрощения, безобидные при 100 000 файлов, становятся проблемами при миллионе. Закономерность всегда одна: какие-то затраты незаметно растут вместе с библиотекой.

  • Хранить всё в памяти. Список из 100 000 записей спокойно помещается в оперативной памяти. При размере в десять раз больше, умноженном на число экранов и кешей, нехватка памяти вызывает подтормаживания, а в худшем случае — сбои.
  • Перепроверять каждый файл, когда изменились лишь некоторые. Повторная проверка всей библиотеки из-за пары новых фото почти незаметна при 100 000 файлов. При миллионе это может означать минуты фоновой работы без видимой пользы.
  • Обновлять экран после каждого изменения. Одно обновление на каждый обработанный файл незаметно в небольшой библиотеке. Когда изменения приходят десятками тысяч, интерфейс может зависнуть.
  • Позволять кешам расти бесконечно. Неограниченный кеш в конце концов начинает конкурировать с теми самыми экранами, которые он должен был ускорять.

Это не экзотические ошибки. Это обычные инженерные решения, которые перестают работать на порядок позже.

Перестройка под миллион

Мы подняли цель до миллиона файлов и заново прошлись по приложению с этим числом в качестве новой планки. Теперь всё, что мы создаём, определяют несколько правил:

  • Потребление памяти не должно расти вместе с библиотекой. Самые тяжёлые экраны со списками теперь загружают файлы из базы данных порциями, а не держат всё в памяти. Большие кеши изображений ограничены по размеру и вытесняют старые записи, а не растут бесконечно. Это внедряется постепенно, экран за экраном; это принцип, по которому мы теперь работаем, а не финишная черта, которую мы уже везде пересекли.
  • Сравнивать, а не перечитывать. Сканирование отслеживает, что изменилось, а не обрабатывает всё заново. Если облачный провайдер предоставляет ленту изменений, мы используем её, а не просматриваем заново целые папки.
  • Интерфейс никогда не должен ждать библиотеку. Тяжёлая работа выполняется в фоне пакетами. Обновления экрана объединяются, так что всплеск из 10 000 изменений не вызывает 10 000 перерисовок.
  • Измерять на реальных устройствах с реальными библиотеками. Профилирование заменило догадки. Самый большой выигрыш дали места, которые мы никогда бы не заподозрили без измерений.

Скорость — это привычка, а не веха

Самым важным изменением стало не какое-то отдельное исправление. Главное — вопрос о миллионе файлов стал частью оценки каждой новой функции: что произойдёт с этим экраном, сканированием или кешем, если библиотека окажется в десять раз больше, чем мы ожидаем?

Кто-нибудь обязательно превысит любое выбранное нами число, и на этот раз мы хотим быть готовы.

Если у вас огромная библиотека, эта работа сделана для вас. Если SyncGallery когда-нибудь покажется медленной с вашей коллекцией, сообщите нам — реальные библиотеки учат нас больше, чем синтетические тесты.

SyncGallery

Попробуйте SyncGallery

Галерея для Android с облачной синхронизацией, которой управляете вы.

Доступно в Google Play
Ещё из блогаНаверх