Объясните пример двойного буфера lz4
В примерах lz4 есть один с именем doublebuffer " https://github.com/Cyan4973/lz4/blob/master/examples/blockStreaming_doubleBuffer.c". Это использует char inpBuf[2][BLOCK_BYTES]
во время цикла чтения-сжатия и использует inpBuf[0][], inpBuf[1][] попеременно.
Я не могу понять пользу этого. Почему бы не использовать один буфер? Что мне не хватает?
1 ответ
Преимущество двойного буфера - лучшая степень сжатия. Это полезно только в том случае, если у вас недостаточно памяти для размещения всего объекта / файла в памяти как одного блока.
Это не очевидно. Так что это заслуживает сравнения, чтобы проверить это.
Вы можете выполнить это упражнение, если хотите испытать его более непосредственно:
1) Сжать файл, разрезав его на блоки по 4 КБ и сжав каждый блок независимо. Обратите внимание на окончательную степень сжатия.
2) Сжать тот же файл, но используя двойной буфер с 2 блоками по 4 КБ, применяя ту же методологию, что и в примере. Обратите внимание на окончательную степень сжатия, она должна быть значительно улучшена.
3) Для более подходящего сравнения повторите тест 1, но на этот раз с использованием независимых блоков 8 КБ, чтобы обе реализации 2 и 3 использовали одинаковый объем памяти. Вы должны еще раз заметить, что реализация 2 предлагает лучшую степень сжатия.
4) Разница в соотношении становится еще более заметной, если использовать "HC" версию LZ4, а не "быструю".
Итак, подведем итог:
- Если у вас достаточно памяти для размещения всего объекта / файла в памяти, вам не нужно использовать этот метод
- Если вам нужно разрезать входные данные на более мелкие блоки, вы можете выбрать лучший коэффициент сжатия, используя двойной буфер, а не независимые блоки. Недостатком является то, что его сложнее настроить.