Nova Prism v0.9.5 — бета
Pre-releaseБета. Формат ещё может измениться — не кладите в архив единственную копию чего-то важного.
Исполняемые файлы сжимаются заметно плотнее. Все преобразователи машинного кода, какие есть — BCJ2 в 7-Zip, BCJ, xz --x86, E8E9 в zpaq, EXECodec в kanzi — трогают ровно три команды: E8, E9 и 0F 8x, то есть относительный адрес перехода. А на 64-битном x86 через второй вид 32-битных смещений идёт каждое обращение к глобальной переменной и каждый вызов через таблицу импорта, и его не выносит в отдельный поток никто. Перепись 10,4 ГБ установленных программ объясняет, почему это стало важно только сейчас: 96,9 % байт исполняемых файлов — 64-битные. Новый фильтр забирает и эти адреса: .NET −9,8 %, Firefox −6,2 %, opencode −5,1 %, Wireshark −3,3 %, Go −2,3 %.
Отсюда и таблица в README: девять настоящих установленных программ (2,74 ГБ) теперь на 5,2 % меньше, чем 7z -mx9 — было 0,2 %; установленный Firefox на 3,9 % меньше — было +2,0 %; дерево исходного кода впервые ушло в минус.
Упаковка быстрее в 1,4–2,9 раза при том же архиве до байта. Очередь блоков почти никогда не разрасталась: порог, при котором ей разрешалось расти, был долей общей памяти машины, а не бюджета программы. На .NET по умолчанию 103,8 → 35,9 с, на Silesia 27,7 → 19,4 с.
Память считается по тому, сколько кодек занимает на самом деле, а не по общей мерке на поток. Маленький бюджет больше не срезает число потоков: Firefox при --memory 1G — пик 1364 → 1045 МБ и время 83,3 → 76,6 с, то есть лучше сразу по обеим осям.
Исправлено: архив из миллионов файлов мог получиться нечитаемым (запись не проверяла потолок, который проверяет чтение; стена измерена — 1,68–2,03 млн файлов); испорченный хвост архива мог заставить программу запросить сотни гигабайт памяти и упасть без сообщения.
Скорость против 7z -mx9, оба прогнаны подряд в одну сессию: enwik8 15,7 с против 47,2, Silesia 15,0 против 43,0, enwik9 61,5 против 169,2 — и архив меньше на 13,3 %, 14,7 % и 10,1 % соответственно.
Совместимость. 0.9.5 читает все прежние архивы — проверено на архивах 0.9.4 объёмом 566 МБ и 5,4 ГБ, распаковка сверена побайтово. Обратно нет: архив 0.9.5 с .exe или .dll на максимальном уровне старая версия не откроет и скажет об этом прямо.
Проверено: 210 автотестов, clippy без замечаний, распаковка сверена diff -r с исходным деревом, -j 1 и -j 8 дают побайтово одинаковый архив. Отдельно прогнан тяжёлый случай, которого раньше не пробовали: 19,5 ГБ и 43 868 файлов в одном архиве.
Пока не сохраняются символические ссылки, потоки NTFS и права доступа. Содержимое файлов не теряется никогда.
Отзывы и новости — t.me/nova_txt