Более эффективное хранилище IndexedDB в Chrome

Новая оптимизация Chrome улучшает хранение данных IndexedDB на диске. Это усовершенствование фокусируется на том, как большие значения управляются в системе хранения Chrome, в частности, путем сжатия определенных файлов, хранящихся на диске. В статье суммированы ключевые моменты этого обновления.

Механизм хранения Chrome до версии 129

Chrome использует LevelDB для хранения данных IndexedDB на диске. LevelDB — это быстрая библиотека хранения значений ключей, но она дает сбои, когда отдельные значения превышают размер страницы базы данных. Чтобы решить эту проблему, с 2017 года Chrome хранит значения размером более одной страницы в виде простых файлов на диске рядом с файлом базы данных.

Память от версии 129

Сжатие больших значений

В отличие от содержимого, хранящегося непосредственно в базе данных LevelDB, которое сжимается перед записью на диск и распаковывается после чтения, большие файлы, хранящиеся как простые файлы, не сжимаются. Благодаря новому обновлению Chrome теперь будет сжимать эти большие файлы с помощью библиотеки сжатия в реальном времени Snappy , что приведет к значительной экономии места. Это особенно эффективно для структурированных данных, таких как большие массивы значений JavaScript, XML или JSON. Это неэффективно для больших медиафайлов, которые уже сжаты, или, что менее распространено, если сайт уже самостоятельно архивирует и разархивирует.

Влияние на эффективность хранения

Если сжатие уменьшает размер файла до размера меньше размера страницы LevelDB, данные перемещаются обратно в LevelDB. Это изменение не только экономит место, но и сокращает операции ввода-вывода на диске, повышая общую производительность.

Моментальный алгоритм сжатия

Команда Chrome выбрала Snappy для сжатия, поскольку он оптимизирует скорость, а не максимальное сжатие. Он достаточно быстр и не приводит к заметному снижению производительности во время сжатия или распаковки.

Улучшения производительности

Сжатие и распаковка выполняются в процессе рендеринга, который является частью многопроцессной архитектуры Chrome. Это уменьшает размер сообщений, отправляемых процессу браузера, что приводит к дальнейшему повышению производительности. Синтетические тесты показали, что это обновление может выполнять некоторые операции в два-три раза быстрее, чем раньше, благодаря уменьшению IPC (межпроцессного взаимодействия) и дискового ввода-вывода. На практике, по измерениям команды Chrome, полезные данные структурированных данных объемом 1 МБ доставляются с диска на страницу примерно за четверть времени (с высокой вариабельностью в зависимости от аппаратного обеспечения устройства и активности системы).

Влияние разработчиков и пользователей

Эти изменения полностью прозрачны как для разработчиков, так и для пользователей. Однако пользователи могут заметить улучшение производительности и сокращение использования хранилища.

  • Экономия места: сжатие применяется только к новым данным, сохраненным после этого обновления. Экономию места можно косвенно наблюдать с помощью веб-API, таких как navigator.storage.estimate() , или в разделе «Хранилище» в Chrome DevTools на панели «Приложение» .
  • Тестирование функции. Разработчики могут протестировать это поведение в предварительных версиях Chrome (до 129), включив эту функцию с помощью флага: --enable-features="IndexedDBCompressValuesWithSnappy" .

Это обновление повышает эффективность Chrome в управлении большими значениями IndexedDB, обеспечивая экономию места и времени без ущерба для производительности, а также существенное улучшение способа хранения данных и доступа к ним в браузере. Понимая эти изменения, разработчики могут извлечь выгоду из постоянных усилий по оптимизации производительности и механизмов хранения Chrome, обеспечивая более плавное и эффективное взаимодействие с пользователем.

Благодарности

Этот документ был проверен Эваном Стэйдом и Рэйчел Эндрю .