Python · MIT · форк saby-integration/v8unpack

v8unpack-accel 2.0

Распаковка .cf, .cfe и .epf без Конфигуратора: в разы быстрее, без сбоев на Windows, результат побайтно тот же.

json.loads вместо автоматабез копированиясерийный пул
8:25УТ 11.5, 883 МБ, целиком; было 46,5 мин
−68%CPU на расширении 3 МБ, медиана 5 раундов
0расхождений: 68 177 файлов дерева, 11 130 файлов разбора

CPU по этапам, секунды

расширение 3 МБ → 1483 файла, медиана 5 раундов с чередованием
0 с6 с12 с18 с24 сВесь прогонВесь прогон — было: 20,98 сВесь прогон — стало: 6,62 с21,0 → 6,6БинарникБинарник — было: 0,49 сБинарник — стало: 0,47 с0,5 → 0,5КонтейнерыКонтейнеры — было: 1,15 сКонтейнеры — стало: 0,89 с1,1 → 0,9РазборРазбор — было: 7,92 сРазбор — стало: 3,53 с7,9 → 3,5ОрганизаторОрганизатор — было: 10,36 сОрганизатор — стало: 0,63 с10,4 → 0,6
1.0.02.0.0
Что это

Обёртки, а не новый распаковщик

Пакет v8unpack 1.2.13 не изменён. Исправления и ускорения — модули в vanteam/tools, они подменяют методы v8unpack во время запуска. Каждое ускорение выключается переменной V8UNPACK_DISABLE, результат при любом наборе одинаковый.

Замер

Что даёт каждое ускорение

Расширение 3 МБ, пять раундов с чередованием, CPU процесса. В каждом варианте выключено ровно одно ускорение. Машина была загружена чужими процессами, поэтому сравнение идёт по CPU, а не по времени по часам. Дерево результата во всех 35 прогонах одно и то же.

CPU распаковки, секунды

0 с6 с12 с18 с24 с2.0.0 со всеми2.0.0 со всеми: 6,62 с6,62 сбез accumбез accum: 6,64 с6,64 сбез ioбез io: 6,97 с6,97 сбез jsonwriteбез jsonwrite: 7,56 с7,56 сбез fastbraceбез fastbrace: 8,70 с8,70 сбез inplaceбез inplace: 9,41 с9,41 с1.0.01.0.0: 20,98 с20,98 с
2.0.01.0.0
Данные
ВариантCPU, ск 2.0.0
2.0.0 со всеми6,62+0%
без accum6,64+0%
без io6,97+5%
без jsonwrite7,56+14%
без fastbrace8,70+31%
без inplace9,41+42%
1.0.020,98+217%

По этапам, CPU в секундах

Этап1.0.02.0.0
Прогон целиком20,986,62
Распаковка бинарника0,490,47
Вложенные контейнеры1,150,89
Разбор объектов7,923,53
Организатор10,360,63
Пик памяти, МБ4144

Организатор больше не копирует дерево: 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.

По этапам, минуты

0 мин10 мин20 мин30 мин40 мин50 мин60 минПрогон целикомПрогон целиком — было: 46,50 минПрогон целиком — стало: 8,42 мин46,5 → 8,4Распаковка бинарникаРаспаковка бинарника — было: 0,58 минРаспаковка бинарника — стало: 1,81 мин0,6 → 1,8Вложенные контейнерыВложенные контейнеры — было: 6,38 минВложенные контейнеры — стало: 1,59 мин6,4 → 1,6Разбор объектовРазбор объектов — было: 10,45 минРазбор объектов — стало: 4,51 мин10,4 → 4,5ОрганизаторОрганизатор — было: 29,02 минОрганизатор — стало: 0,52 мин29,0 → 0,5
1.0.02.0.0

Код первого этапа не менялся; он медленнее, вероятно, из-за фоновой нагрузки во время прогона.

Этапы, мин:с

Этап1.0.02.0.0
Распаковка бинарника0:351:49
Вложенные контейнеры6:231:35
Разбор объектов10:274:31
Организатор29:010:31
Всего46:308:25

Тяжёлая форма 2 МБ разбирается за 0,06 с CPU; исходный разборщик v8unpack — 537 с, 1.0.0 — 0,53 с.

Приёмка

Результат тот же, байт в байт

Критерии заданы до замеров. Доказательства — vanteam/releases/v8unpack-accel/v2.0.0/evidence.

ПроверкаОбъёмИтог
Разбор против исходного JsonContainerDecoder400 случайных файлов и 3 тяжёлые формы0 расхождений
Разбор через json.loads против 1.0.011 130 файлов двух распаковок УНФ0 расхождений
Запись JSON против json.dumps4060 файлов УТ 11.50 расхождений
Расширение 3 МБ, все варианты35 прогоноводно дерево
УТ 11.5 против распаковки 1.0.068 177 файлов, 24 075 каталоговпобайтно
Патчи 2.0.0 поверх 1.0.09 патчейпобайтно
Запуск

Три команды

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