Обёртки, а не новый распаковщик
Пакет v8unpack 1.2.13 не изменён. Исправления и ускорения — модули в vanteam/tools, они подменяют методы v8unpack во время запуска. Каждое ускорение выключается переменной V8UNPACK_DISABLE, результат при любом наборе одинаковый.
Что даёт каждое ускорение
Расширение 3 МБ, пять раундов с чередованием, CPU процесса. В каждом варианте выключено ровно одно ускорение. Машина была загружена чужими процессами, поэтому сравнение идёт по CPU, а не по времени по часам. Дерево результата во всех 35 прогонах одно и то же.
CPU распаковки, секунды
Данные
| Вариант | CPU, с | к 2.0.0 |
|---|---|---|
| 2.0.0 со всеми | 6,62 | +0% |
| без accum | 6,64 | +0% |
| без io | 6,97 | +5% |
| без jsonwrite | 7,56 | +14% |
| без fastbrace | 8,70 | +31% |
| без inplace | 9,41 | +42% |
| 1.0.0 | 20,98 | +217% |
По этапам, CPU в секундах
| Этап | 1.0.0 | 2.0.0 |
|---|---|---|
| Прогон целиком | 20,98 | 6,62 |
| Распаковка бинарника | 0,49 | 0,47 |
| Вложенные контейнеры | 1,15 | 0,89 |
| Разбор объектов | 7,92 | 3,53 |
| Организатор | 10,36 | 0,63 |
| Пик памяти, МБ | 41 | 44 |
Организатор больше не копирует дерево: decode_stage_3 переносится в результат одним переименованием. Разбор скобочного формата идёт через json.loads, запись JSON — одной строкой.
УТ 11.5: 46,5 мин → 8 мин 25 с
Полная распаковка 883 МБ → 68 177 файлов, время по часам. 1.0.0 — журнал 28.09, 2.0.0 — прогон 29.09: условия разные, это ориентир. Дерево 2.0.0 побайтно равно распаковке 1.0.0.
По этапам, минуты
Код первого этапа не менялся; он медленнее, вероятно, из-за фоновой нагрузки во время прогона.
Этапы, мин:с
| Этап | 1.0.0 | 2.0.0 |
|---|---|---|
| Распаковка бинарника | 0:35 | 1:49 |
| Вложенные контейнеры | 6:23 | 1:35 |
| Разбор объектов | 10:27 | 4:31 |
| Организатор | 29:01 | 0:31 |
| Всего | 46:30 | 8:25 |
Тяжёлая форма 2 МБ разбирается за 0,06 с CPU; исходный разборщик v8unpack — 537 с, 1.0.0 — 0,53 с.
Результат тот же, байт в байт
Критерии заданы до замеров. Доказательства — vanteam/releases/v8unpack-accel/v2.0.0/evidence.
| Проверка | Объём | Итог |
|---|---|---|
Разбор против исходного JsonContainerDecoder | 400 случайных файлов и 3 тяжёлые формы | 0 расхождений |
Разбор через json.loads против 1.0.0 | 11 130 файлов двух распаковок УНФ | 0 расхождений |
Запись JSON против json.dumps | 4060 файлов УТ 11.5 | 0 расхождений |
| Расширение 3 МБ, все варианты | 35 прогонов | одно дерево |
| УТ 11.5 против распаковки 1.0.0 | 68 177 файлов, 24 075 каталогов | побайтно |
| Патчи 2.0.0 поверх 1.0.0 | 9 патчей | побайтно |
Три команды
Python 3.11, pip install v8unpack==1.2.13; psutil нужен только для продолжения после обрыва. Не передавайте --descent: это номер версии для инкрементальной сборки, а не глубина.
python vanteam/tools/check_cf.py "файл.cf" python vanteam/tools/run_unpack.py "файл.cf" "каталог_результата" "каталог_temp" python vanteam/tools/v8unpack_serial.py "файл.cfe" "каталог_результата" rem выключить отдельные ускорения, результат тот же set V8UNPACK_DISABLE=fastbrace,inplace