Домой Статьи и аналитика Технологии ZXC 0.9.0: асимметричное сжатие данных с акцентом на скорость распаковки

ZXC 0.9.0: асимметричное сжатие данных с акцентом на скорость распаковки

Вышел крупный апдейт библиотеки ZXC для быстрого сжатия данных с поддержкой многопоточности и оптимизацией под ARM-архитектуры.

ZXC 0.9.0: асимметричное сжатие данных с акцентом на скорость распаковки
ZXC 0.9.0: асимметричное сжатие данных с акцентом на скорость распаковки — иллюстрация к материалу. Источник: linux.org.ru

Состоялся официальный релиз версии 0.9.0 библиотеки и кроссплатформенной консольной утилиты ZXC. Проект представляет собой инструмент для высокопроизводительного многопоточного асимметричного сжатия данных без потерь. Технология оптимизирована для работы с игровыми ресурсами, прошивками и пакетами приложений, использующих подход «один раз записать, многократно читать» (WORM).

Главная особенность ZXC заключается в приоритете скорости распаковки над скоростью сжатия, что выгодно отличает его от популярных решений вроде LZ4. По данным разработчиков, производительность распаковки на архитектуре Apple Silicon выше на 40%, на Google Axion (ARM64) — на 25%, а на x86_64 — на 5%. При этом коэффициент сжатия остается более высоким по сравнению с аналогами.

В актуальном обновлении 0.9.0 внедрена поддержка многократно используемого контекста, гибкая настройка размеров блоков, а также полная техническая документация. Помимо этого, разработчики устранили ряд уязвимостей, включая проблему переполнения буфера в куче, выявленную с помощью фаззинг-тестирования. Важно отметить, что версия SOVERSION была увеличена до 2, так как релиз содержит изменения, нарушающие ABI.

Ключевые изменения и новые возможности

Проект написан на языке C и распространяется по свободной лицензии BSD 3. Основные новшества включают:

  • Нарушение обратной совместимости: Бинарные файлы, собранные под версию SOVERSION 1, требуют перекомпиляции. Функции zxc_compress() и zxc_decompress() теперь используют структуры опций вместо набора позиционных параметров.
  • Оптимизация API: Внедрены непрозрачные контексты сжатия и распаковки (cctx и dctx), размещаемые в куче. Это позволяет избежать затрат на повторное выделение памяти при частых вызовах, что особенно полезно для интеграции в файловые системы вроде squashfs или dwarfs.
  • Настройка размеров блоков: Параметр block_size теперь можно варьировать в диапазоне от 4 КБ до 2 МБ (степень двойки), при этом значение по умолчанию составляет 256 КБ. В консольной утилите появилась поддержка флага --block-size с удобными суффиксами единиц измерения.
  • Улучшение производительности: Реализована быстрая прямая декомпрессия, при которой исключается промежуточное копирование в рабочий буфер, если буфер назначения располагает достаточным объемом пространства.

Безопасность и документация

Разработчики уделили особое внимание стабильности кода и доступности документации:

  • Исправление ошибок: Устранено потенциальное переполнение буфера кучи в zxc_bitpack_stream_32 и добавлена проверка корректности размера потока при декомпрессии для предотвращения чтения за пределами допустимых границ.
  • Совместимость: Публичные заголовочные файлы получили защитные конструкции extern "C" для корректной работы в C++ проектах.
  • Новые справочники: В файле docs/API.md представлен полный разбор 21 экспортируемого символа, а в docs/FORMAT.md обновлено описание кодирования размера блока.
  • Экосистема: Обновлены официальные врапперы для языков программирования Python, Rust и среды Node.js.
Источник: https://www.linux.org.ru