article.tex
This commit is contained in:
@@ -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:<encoded-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
|
||||
|
||||
Reference in New Issue
Block a user