Files
UniversalContainer/docs/benchmarking.md
T
Efim Beshmenev aea6e330e3 Realisation v1
2026-08-11 22:19:34 +03:00

4.1 KiB
Raw Blame History

Сборка и benchmark-методика

Профили кода

Все сравниваемые бинарники — Release x64 /O2, /MT, без IPO/LTO. Отличается только ось SIMD:

Профиль Ключи проекта Назначение
scalar /O2 /d2Qvec- /Qvec-report:1 /Oi- MSVC-specific project-novec
baseline /O2, без /arch:AVX* обычный MSVC x64
avx2 /O2 /arch:AVX2 разрешён AVX2

/d2Qvec- — внутренний, недокументированный ключ MSVC, а не переносимая гарантия. Командная строка проверена автоматическим аудитом для MSVC 19.51; вывод /Qvec-report пока не разбирается как отдельное доказательство. scalar не означает «ни одной SIMD-инструкции в процессе»: x64 ABI имеет SSE2-baseline, а CRT memmove может runtime-dispatch-ить SIMD. Дополнительно задаётся _USE_STD_VECTOR_ALGORITHMS=0, чтобы STL не включала свои явно векторизованные алгоритмы. Это честнее называть project-novec.

Матрица

Benchmark сравнивает:

  • reserved std::vector;
  • std::deque;
  • std::list с index semantics;
  • forced tiered для каждого leaf 64/128/256/512/1024;
  • adaptive deferred;
  • experimental adaptive eager-read.

std::deque и std::list — только внешние фиксированные baselines; AdaptiveSequence никогда в них не переключается. Для std::list runner эмулирует index semantics линейным проходом, поэтому доступ по индексу имеет O(N).

Типы: uint32_t, uint64_t, trivially-copyable 16/32/64-byte значения и non-trivial movable string wrapper. Workloads включают random access, traversal, append, 99.99/99/80/50% reads, uniform/localized edits, bursty edits и отдельный phase trace:

uniform edits -> maintenance
localized edits -> maintenance
reads -> maintenance

Последний trace нужен именно для проверки смены leaf, а не только vector↔tiered. Время rebuild остаётся внутри измеряемого end-to-end интервала.

Tuning перебирает leaf 64…1024 и maximum directory levels 2/3/4. Каталог сам останавливает построение на минимально достаточной глубине.

CSV

Raw CSV содержит profile/type/workload/N/seed, initial и final tier config, total/ns-per-op, p50/p95/p99/max edit latency, checksum, allocated bytes, storage switches, shape rebuilds и final mode. Checksum должен совпасть у всех контейнеров одной трассы.

tools/analyze_results.ps1 сначала берёт median повторов, затем сравнивает с лучшим фиксированным baseline в каждой ячейке. Итоговый geometric mean считается иерархически по sizes → workloads → types → profiles, чтобы семейство с большим числом строк не получило лишний вес.

Масштабы запуска

benchmark.bat smoke   rem проверка всего конвейера
benchmark.bat quick   rem рабочее исследование
benchmark.bat full    rem финальные повторы, длительный запуск

Для публикации финального числа нужны одинаковый power plan, отсутствие тяжёлой фоновой нагрузки, закрепление на физическом ядре, randomized paired order и holdout workloads/seeds. Текущие quick-данные являются calibration set, а не финальным доказательством.