From 4ebf8fe4a8e8f22a651a876e796147b1fcf85158 Mon Sep 17 00:00:00 2001 From: Dmitrii Krosh Date: Thu, 10 Sep 2026 19:09:50 +0300 Subject: [PATCH] article.tex --- articles/for-alt/article.tex | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/articles/for-alt/article.tex b/articles/for-alt/article.tex index 818a544..3a61f65 100644 --- a/articles/for-alt/article.tex +++ b/articles/for-alt/article.tex @@ -27,6 +27,9 @@ \keywords{ALT RPM, ELF-символы, set:version, Golomb--Rice} +\begingroup +\setlength{\emergencystretch}{3em} + \section*{1. Зачем нужны set-строки} Обычная зависимость от версии библиотеки не гарантирует, что в ней остались все нужные программе символы: символ можно удалить, не сменив SONAME, а одинаковые SONAME могут скрывать разные наборы экспортов. Поэтому ALT RPM использует версии зависимостей вида \texttt{set:}. Для \texttt{Provides} такая строка описывает символы, предоставляемые библиотекой, а для \texttt{Requires} --- символы, которые конкретный потребитель требует от неё. В такой конфигурации сравниваются не номера версий, а включение множеств: все хэши символов из \texttt{Requires} должны присутствовать в \texttt{Provides}. @@ -101,7 +104,7 @@ set-строка \subsection*{3.1. Слитый декодер} -Вместо последовательного декодирования Base62 и Golomb--Rice применяется функция \texttt{decode\_base62\_golomb()}, объединяющая оба этапа. Она считывает Base62-полезную нагрузку парами символов, с помощью заранее вычисленной таблицы получает биты, накапливает блоки до 24 бит и сразу декодирует значения Golomb--Rice. После этого восстанавливаются абсолютные значения из дельт. +Вместо последовательного декодирования Base62 и Golomb--Rice применяется функция \texttt{decode\_base62}\allowbreak\texttt{\_golomb()}, объединяющая оба этапа. Она считывает Base62-полезную нагрузку парами символов, с помощью заранее вычисленной таблицы получает биты, накапливает блоки до 24 бит и сразу декодирует значения Golomb--Rice. После этого восстанавливаются абсолютные значения из дельт. Роль этой оптимизации подтверждается отдельной контрольной серией: вариант без оптимизированного декодера расходовал в APT-симуляциях в 1,47--2,82 раза больше суммарного процессорного времени, чем исходный \texttt{set.c}. @@ -175,7 +178,7 @@ set-строка \subsection*{5.2. Тестирование хэш-функций} -Отдельно проверялась идея заменить Jenkins OAAT на CityHash32 или XXH32. На фиксированных случайных байтовых строках, медиана трёх запусков, Jenkins уступал по скорости: для длины 16 байт получены 22,330 нс/хэш против 10,402 у CityHash32 и 7,792 у XXH32; для 1024 байт --- 1796,485 против 232,598 и 184,234 нс/хэш соответственно. +Отдельно проверялась идея заменить Jenkins OAAT на CityHash32 или XXH32. На фиксированных случайных байтовых строках, медиана трёх запусков, Jenkins уступал: для 16 байт --- 22,330 нс/хэш; CityHash32 --- 10,402; XXH32 --- 7,792. Для 1024 байт значения составили 1796,485, 232,598 и 184,234 нс/хэш соответственно. Однако скорость отдельной хэш-функции не описывает её качества на данных, характерных для \texttt{set:}-строк. Поэтому для Jenkins OAAT, XXH64 и t1ha2 @@ -183,8 +186,8 @@ set-строка из 577\,509 уникальных C++ ABI-символов, извлечённых из 259 ELF-файлов пяти пакетов ALT p11. Корпус намеренно содержит близкие по префиксу имена: 99,60\% символов имеют с другим символом общий префикс длиной не менее 12 знаков, а -95,05\% --- не менее 24 знаков. Среднее отклонение $P(\text{bit}=1)$ от -$0{,}5$ равно 0,0475 процентного пункта для Jenkins OAAT, 0,0431 для XXH64 и +95,05\% --- не менее 24 знаков. Среднее отклонение вероятности единицы в +выходном бите от $0{,}5$ равно 0,0475 процентного пункта для Jenkins OAAT, 0,0431 для XXH64 и 0,0615 для t1ha2; максимальное отклонение одного бита --- 0,167, 0,122 и 0,188 процентного пункта соответственно. Следовательно, все три функции достаточно равномерно смешивают проверенный корпус; только по этой метрике @@ -198,6 +201,8 @@ $0{,}5$ равно 0,0475 процентного пункта для Jenkins OAA Эксперименты с прямым хранением хэшей, Roaring Bitmap и альтернативными хэш-функциями уточнили границы дальнейшей оптимизации. +\endgroup + %%% Local Variables: %%% mode: latex