Эта библиотека предлагает два высокоскоростных энтропийных кодера:
Huff0 — кодек Хаффмана, разработанный для современных процессоров, обеспечивающий операции OoO (вне порядка) на нескольких ALU (арифметико-логических устройствах), обеспечивающий чрезвычайно высокую скорость сжатия и распаковки.
FSE — это новый тип энтропийного кодировщика, основанный на теории ANS от Ярека Дуды, обеспечивающий точную точность сжатия (например, арифметическое кодирование) на гораздо более высоких скоростях.
Ветвь | Статус |
---|---|
владелец | |
разработчик |
Тесты проводятся на процессоре Intel Core i7-5600U с 64-разрядной версией Linux Mint. Исходный код скомпилирован с использованием GCC 4.8.4, 64-битный режим. Тестовые файлы создаются с помощью прилагаемой программы probagen
. Benchmark разбивает файлы примеров на блоки по 32 КБ. Huff0
и FSE
сравниваются с zlibh
, кодировщиком Хаффмана в zlib, предоставленным Фредериком Кайзером.
Файл | Кодек | Соотношение | Сжатие | Декомпрессия |
---|---|---|---|---|
Проба80 | ||||
Хафф0 | 6.38 | 600 МБ/с | 1350 МБ/с | |
ФСЕ | 8,84 | 325 МБ/с | 440 МБ/с | |
Злибх | 6.38 | 265 МБ/с | 300 МБ/с | |
Проба14 | ||||
Хафф0 | 1,90 | 595 МБ/с | 860 МБ/с | |
ФСЕ | 1,91 | 330 МБ/с | 460 МБ/с | |
Злибх | 1,90 | 255 МБ/с | 250 МБ/с | |
Проба02 | ||||
Хафф0 | 1.13 | 525 МБ/с | 555 МБ/с | |
ФСЕ | 1.13 | 325 МБ/с | 445 МБ/с | |
Злибх | 1.13 | 180 МБ/с | 210 МБ/с |
По замыслу Хаффман не может нарушить ограничение «1 бит на символ», следовательно, теряет эффективность в сжатых дистрибутивах, таких как Proba80
. FSE лишен такого ограничения, и его эффективность сжатия при любых обстоятельствах остается близкой к пределу Шеннона. Однако эта точность не всегда необходима, и менее сжимаемые распределения мало отличаются от распределения Хаффмана. Со своей стороны, Huff0 обеспечивает огромное преимущество в скорости.
Внешние вклады приветствуются и поощряются. Ветка «master» предназначена только для размещения стабильных выпусков. Ветка «dev» объединяет все вклады. Если вы хотите предложить патч, пожалуйста, внесите изменения в ветку «dev» или специальную ветку функций. Прямая фиксация «master» не допускается.