Crab & CodecCraver
CodecCraver CodecCraver
Привет, Крабок, я тут копалась в алгоритме gzip и задумалась, как LZ77, используемый в нем, соотносится с LZ4+entropy blend в zstd. Ты думаешь, этот компромисс в энтропийном кодировании реально влияет на целостность файлов, или это просто вопрос скорости?
Crab Crab
Разница в энтропийном кодировании имеет большее значение, чем многим кажется, но речь не об «целостности файла» в смысле повреждения – это о том, насколько точно ты можешь восстановить данные с минимальными издержками. Deflate в Gzip использует кодирование Хаффмана после довольно простого прохода LZ77. Zstd же делает более сложный этап LZ77, а затем использует вариант RANS (Range Asymmetric Numeral System) для энтропии, что гораздо эффективнее при упаковке данных с высокой энтропией. На практике это означает, что zstd может выжать на несколько процентов больше сжатия при той же скорости или даже быстрее на современных процессорах, потому что этап энтропии не добавляет столько задержек, как Хаффман. Что касается целостности, оба кодека без потерь, так что, если ты не обрезаешь поток, все в порядке. Главный компромисс – это сколько процессорного времени ты готова потратить на сжатие по сравнению с распаковкой, и сколько трафика ты сможешь сэкономить. Так что, если тебе нужна самая быстрая распаковка на устройстве с ограниченным процессором, gzip может оказаться предпочтительнее, потому что его таблицы Хаффмана очень легкие. Если же тебе нужен абсолютно лучший коэффициент сжатия, или ты передаешь данные по каналу с ограниченной пропускной способностью, энтропийное кодирование zstd даст большую отдачу от инвестиций в трафик. Выбор сводится к скорости против эффективности сжатия, а не к целостности данных.
CodecCraver CodecCraver
Крутая разборка. Я всегда считала gzip – быстрым решением для быстрой декомпрессии, а zstd ощущается как целый арсенал алхимии, который еще и файлы лучше сжимает. Для меня это всегда про "священное" соотношение скорости и нагрузки на процессор. А что используешь ты, когда стримишь данные в реальном времени?
Crab Crab
Для стримов я всегда выбираю режим с минимальной задержкой. Обычно лучше всего работает Zstd в режиме "fast": он сжимает чуть лучше, чем gzip, но при этом декомпрессор не нагружает процессор – остается в пределах нескольких сотен циклов даже на современных процессорах. Если приходится работать на старом компьютере или нужен самый простой вариант, я переключаюсь на gzip по умолчанию – его таблицы очень маленькие, и код очень прямолинейный. Короче говоря: Zstd fast для большинства современных устройств, а gzip только когда нужна самая простая и быстрая декомпрессия.
CodecCraver CodecCraver
Отлично! Буду использовать zstd в быстром режиме, а gzip подключать только если процессор совсем уж древний. Так декодирование будет чище, и потери пакетов минимальные. Приятного стриминга!