add report from Taranukha Leonid - #19
Conversation
gsvgit
left a comment
There was a problem hiding this comment.
Подобно чуть позже гляну, но графики лучше готовыми в чем-то типа matplotlib сделать.
| {\Large \textbf{Реализация типа \enquote{Множество} на основе АВЛ-дерева на языке F\#}}\\[1.5cm] | ||
|
|
||
| \begin{flushright} | ||
| \begin{tabular}{rl} |
There was a problem hiding this comment.
Мне кажется, в шаблоне шапка иначе устроена?
| \begin{document} | ||
|
|
||
| \begin{center} | ||
| {\large САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ}\\[0.3cm] |
|
|
||
| \section{Постановка задачи} | ||
|
|
||
| Данная работа посвящена реализации неизменяемой структуры данных \enquote{Множество} на основе АВЛ-дерева на языке F\#. Проект выполняется в рамках открытого исследовательского сообщества Lamagraph и интегрируется в репозиторий QTreeFSharp --- прототип сетей взаимодействия для анализа данных методами линейной алгебры. |
There was a problem hiding this comment.
- Неразрывные пробелы перед тире.
- "прототип сетей взаимодействия для анализа данных методами линейной алгебры" --- вообще нет.
|
|
||
| Данная работа посвящена реализации неизменяемой структуры данных \enquote{Множество} на основе АВЛ-дерева на языке F\#. Проект выполняется в рамках открытого исследовательского сообщества Lamagraph и интегрируется в репозиторий QTreeFSharp --- прототип сетей взаимодействия для анализа данных методами линейной алгебры. | ||
|
|
||
| Фундаментальные графовые алгоритмы требуют эффективных структур для хранения уникальных элементов и выполнения теоретико-множественных операций. |
|
|
||
| Фундаментальные графовые алгоритмы требуют эффективных структур для хранения уникальных элементов и выполнения теоретико-множественных операций. | ||
|
|
||
| \textbf{Целью работы является} реализация структуры данных \enquote{Множество} с автоматической балансировкой и оценка ее производительности. |
| Профилирование выполнялось с помощью библиотеки \verb|BenchmarkDotNet| (ОС Ubuntu 24.04.4 LTS, .NET 10.0.7, процессор Intel Core i5-12450H). Размер базового множества $A$ варьировался от $100$ до $100\,000$ элементов. Размер вторичного множества $B$ составлял $100$ и $10\,000$ элементов. | ||
|
|
||
| \subsection{Одиночные операции} | ||
| Результаты замеров для одиночных операций показывают сложность $O(\log N)$. Увеличение количества узлов на три порядка (со 100 до 100\,000) приводит к росту времени выполнения вставки с 582~нс до 1376~нс. Объем выделяемой памяти изменяется логарифмически от 840 до 2080 байт на операцию. |
There was a problem hiding this comment.
Результаты практических замеров крайне редко показывают теоретическую оценку.
There was a problem hiding this comment.
Доказательство того, что на графике действительно что-то очень похожее на логарифм --- это занятие, требующее аккуратной работы с матстатом.
| \item Реализована структура данных АВЛ-Множества на языке F\#. | ||
| \item Разработаны алгоритмы теоретико-множественных операций в трех вариантах (последовательный, обход, многопоточный). | ||
| \item Написаны модульные и property-based тесты. | ||
| \item Проведено профилирование, на основе которого выявлены условия применимости параллельного метода и метода обхода дерева. |
| \item Проведено профилирование, на основе которого выявлены условия применимости параллельного метода и метода обхода дерева. | ||
| \end{itemize} | ||
|
|
||
| Кодовая база и результаты тестов размещены в открытом доступе: |
|
|
||
| \newpage | ||
| \appendix | ||
| \section{Приложение: Результаты профилирования} |
There was a problem hiding this comment.
Либо это ценно и в остновном тексте, либо нафиг удпалить.
| \item Pull Request: \url{https://github.com/Lamagraph/QTreeFSharp/pull/17} | ||
| \end{itemize} | ||
|
|
||
| \section*{Литература} |
There was a problem hiding this comment.
В шаблоне были примеры оформления литературы.
|
|
||
| \section{Эксперименты} | ||
|
|
||
| Бенчмаркинг выполнялся с помощью библиотеки \verb|BenchmarkDotNet| (ОС Ubuntu 24.04.4 LTS, .NET 10.0.7, процессор Intel Core i5-12450H). Размер базового множества $A$ варьировался от $100$ до $100\,000$ элементов. Размер вторичного множества $B$ составлял $100$, $10\,000$ и $100\,000$ элементов для оценки производительности алгоритмов при различных масштабах данных. |
|
|
||
| Бенчмаркинг выполнялся с помощью библиотеки \verb|BenchmarkDotNet| (ОС Ubuntu 24.04.4 LTS, .NET 10.0.7, процессор Intel Core i5-12450H). Размер базового множества $A$ варьировался от $100$ до $100\,000$ элементов. Размер вторичного множества $B$ составлял $100$, $10\,000$ и $100\,000$ элементов для оценки производительности алгоритмов при различных масштабах данных. | ||
|
|
||
| В таблице~\ref{tab:summary} представлены замеры, демонстрирующие крайние случаи алгоритмического поведения. |
There was a problem hiding this comment.
"крайние случаи алгоритмического поведения" -- чо?
| \end{table} | ||
|
|
||
| \subsection{Одиночные операции} | ||
| Результаты замеров для одиночных операций соотносятся с предполагаемой сложностью $O(\log N)$. Увеличение количества узлов на три порядка (со 100 до 100\,000) приводит к росту времени выполнения вставки с 582~нс до 1376~нс. Объем выделяемой памяти изменяется логарифмически от 840 до 2080 байт на операцию. |
| \label{fig:parallel} | ||
| \end{figure} | ||
|
|
||
| Многопоточная реализация уступает последовательной во всех рассмотренных сценариях. При пересечении множеств $10\,000 \times 100\,000$ последовательный алгоритм выполняется за $15,4$~мс, в то время как параллельный на четырех потоках~--- за $354,3$~мс. Снижение производительности обусловлено накладными расходами пула потоков на планирование множества микрозадач и интенсивной работой сборщика мусора. |
There was a problem hiding this comment.
Как выяснили, в чём именно проблема с парарллельностью? Может она у Вас просто неправильно сделана.
| \label{fig:parallel} | ||
| \end{figure} | ||
|
|
||
| Многопоточная реализация уступает последовательной во всех рассмотренных сценариях. При пересечении множеств $10\,000 \times 100\,000$ последовательный алгоритм выполняется за $15,4$~мс, в то время как параллельный на четырех потоках~--- за $354,3$~мс. Снижение производительности обусловлено отсутствием порога отсечения\footnote{\textbf{Порог отсечения} --- размер задачи, ниже которого накладные расходы на создание и планирование новых потоков начинают снижать производительность. По достижении этого порога необходимо начать последовательное выполнение.} для \verb|Async.Parallel| в данной реализации. Накладные расходы на планирование тысяч микрозадач и паузы сборщика мусора из-за возросшего потребления памяти (с 18 до 100,2~МБ) многократно увеличивают время выполнения. |
| Добавление & $100 \times \text{---}$ & Sequential & 582 нс & 880 Б & 1.00 (Эталон) \\ | ||
| Добавление & $100\,000 \times \text{---}$ & Sequential & 1376 нс & 2080 Б & $\approx 2.3\times$ \\ | ||
| \midrule | ||
| Пересечение & $100\,000 \times 100$ & Sequential & 318 мкс & 447 КБ & 1.00 (Эталон) \\ |
There was a problem hiding this comment.
Лучше всё в одинаковых единицах указывать. Ещё и с одинаковой точностью. Проще анализировать и сравнивать. А то переводи нано в микро и обратоно.
There was a problem hiding this comment.
Мкс перевел в нс, но мс оставил
| \end{table} | ||
|
|
||
| \subsection{Одиночные операции} | ||
| Анализ результатов замеров показывает логарифмический характер роста времени выполнения базовых операций. Отношение максимальных высот АВЛ-деревьев (возможных) для $N=100\,000$ и $N=100$ составляет $\approx 2,5$ ($\log_2 10^5 / \log_2 10^2$). На практике время выполнения операции добавления выросло с 582~нс до 1376~нс (коэффициент роста $\approx 2,36$), что согласуется с ожидаемым поведением деревьев и их высотами. Объем выделяемой памяти изменяется от 840 до 2080 байт на операцию. |
There was a problem hiding this comment.
"логарифмический характер" --- почему?
There was a problem hiding this comment.
Если что, "$\approx 2,5$" --- не пояснение.
| \label{fig:parallel} | ||
| \end{figure} | ||
|
|
||
| Многопоточная реализация уступает последовательной во всех рассмотренных сценариях. При пересечении множеств $10\,000 \times 100\,000$ последовательный алгоритм выполняется за $15,4$~мс, в то время как параллельный на четырех потоках~--- за $354,3$~мс. Снижение производительности обусловлено отсутствием порога отсечения\footnote{\textbf{Порог отсечения} --- размер задачи, ниже которого накладные расходы на создание и планирование новых потоков начинают снижать производительность. По достижении этого порога необходимо начать последовательное выполнение.} для \verb|Async.Parallel| в данной реализации. Накладные расходы на планирование тысяч микрозадач и паузы сборщика мусора из-за возросшего потребления памяти (с 18 до 100,2~МБ) многократно увеличивают время выполнения. |
There was a problem hiding this comment.
Так может стоит сделать порог? А то "я сделал фигню, даже знаю, как сделать не фигню, но делать, конечно же, не буду".
There was a problem hiding this comment.
Я добавил порог, теперь параллельный стал быстрее
Сейчас буду пушить это в основной репозиторий
There was a problem hiding this comment.
Быстрее не просто в общем, а именно последовательной реализации
| {Ekaterina_Arzamaszeva/Ekaterina_Arzamaszeva_report.pdf} | ||
| \end{document} No newline at end of file | ||
| \includepdf[pages=-, | ||
| addtotoc={1, section, 1, {Тарануха Леонид Антонович, Реализация типа "Множество" на основе АВЛ-дерева на языке F\#}, taranukha_leonid}] |
| Реализовано три подхода к операциям над множествами. | ||
|
|
||
| \begin{enumerate} | ||
| \item \textbf{Последовательный (Sequential):} Базовый алгоритм рекурсивного слияния. Использует функции \verb|split| (разделение дерева по ключу) и \verb|join| (слияние). Является эталоном производительности. |
| \toprule | ||
| \textbf{Операция} & \textbf{Размеры ($A \times B$)} & \textbf{Метод} & \textbf{Время} & \textbf{Память} & \textbf{Отношение} \\ | ||
| \midrule | ||
| Добавление & $100 \times \text{---}$ & Sequential & 582 нс & 880 Б & 1.00 (Эталон) \\ |
There was a problem hiding this comment.
- А с памятью?
- Ну зачееем. Во-первых, единицы не надо писать в каждой ячейке. Во-вторых, выберите что-то, что позволит в одном масштабе всё записать. Может секунды с двумя-тремя знаками после запятой. Если проблема, может дело в том, что эксперименты странно поставлены? В чём цель эксперимента.
| \label{fig:parallel} | ||
| \end{figure} | ||
|
|
||
| Введение порога отсечения (granularity threshold) позволило многопоточной реализации продемонстрировать высокую эффективность. Алгоритм прекращает создание асинхронных задач и переключается на последовательное выполнение для поддеревьев с высотой $h < 10$. |
There was a problem hiding this comment.
А это точно лучшее решение? Может стоило ограничиения привязать к доступным ядрам/потокам?
No description provided.