Внёс правки

This commit is contained in:
никита покладов
2025-02-27 22:16:07 +04:00
parent 2c635b4cf1
commit 57a05586f2
2 changed files with 114 additions and 78 deletions

View File

@@ -1,94 +1,65 @@
# Лабораторная №1
Разработка многопоточного приложения с использованием Java Concurrency
согласно варианту задания.
Необходимо:
1 Разработать однопоточный вариант алгоритма и замерить время его работы.
2 Разработать параллельный вариант алгоритма с использованием
ThreadPoolExecutor и замерить время его работы
3 Разработать параллельный вариант алгоритма с использованием ForkJoinPoll
и замерить время его работы.
ВАЖНО: Массив генерируется до работы всех вариантов алгоритмов. Все три
алгоритма обрабатывают три одинаковых массива.
## Вариант и задание
17 Упорядочить строки матрицы по убыванию суммы элементов.
### Описание
Данная программа разработана для сравнения производительности однопоточного и многопоточного подходов к сортировке строк матрицы по убыванию суммы их элементов. Задача состоит из двух основных частей:
Подсчёт сумм строк: Для каждой строки матрицы вычисляется сумма её элементов.
Сортировка строк: Строки матрицы сортируются по убыванию суммы их элементов.
Эти этапы показывают разные затраты времени при различных соотношениях матрицы.
Для того, чтобы замеры были адеватными, было принято решение замерить время выполнения различных комбинаций при различных соотношениях сторон матрицы.
1. **Подсчёт сумм строк**: Для каждой строки матрицы вычисляется сумма её элементов.
2. **Сортировка строк**: Строки матрицы сортируются по убыванию суммы их элементов.
Эти этапы выполняются с разными вариантами многопоточности, чтобы выявить их влияние на производительность при различных размерах матрицы.
Как запустить лабораторную работу:
### Как запустить
```sh
javac MatrixSorter.java
java MatrixSorter
```
### Используемые технологии
Программа использует **Java Concurrency**, включая классы и интерфейсы:
- `ExecutorService`, `ThreadPoolExecutor`, `ForkJoinPool`, `Future`, `CompletableFuture`, `RecursiveAction` — для организации многопоточности.
### Что делает программа
1. Генерирует матрицу заданного размера, заполненную случайными значениями.
2. Вычисляет сумму элементов каждой строки.
3. Сортирует строки по убыванию их суммы.
4. Замеряет среднее время выполнения разных комбинаций подсчёта и сортировки.
Используемые технологии
Java Concurrency: Используются такие классы и интерфейсы, как ExecutorService, ThreadPoolExecutor, ForkJoinPool, Future, CompletableFuture, RecursiveAction для реализации многопоточности.
---
## Анализ результатов
### Результаты в файле res.txt
Что делает программа
1. Программа генерирует матрицу заданного размера, заполненную случайными значениями.
2. Для каждой строки матрицы вычисляется сумма её элементов.
3. Строки матрицы сортируются по убыванию суммы их элементов. Используются три подхода:
4. Программа замеряет время выполнения каждого из подходов и выводит среднее время выполнения для каждого сочетания алгоритмов.
### Маленькие матрицы (10 x 1000000, 100 x 100000)
- Использование многопоточности не даёт значительного прироста, так как оверхед на создание потоков превышает выгоду от распараллеливания.
- `ThreadPool` или `ForkJoin` для сортировки могут даже слегка ухудшать производительность из-за накладных расходов.
### Средние матрицы (1000 x 10000, 10000 x 1000)
- На этом размере многопоточное суммирование (`ThreadPool`, `ForkJoin`) начинает давать выгоду.
- `ForkJoin` работает стабильно, а `ThreadPool` может давать как ускорение, так и замедление.
- На сортировке многопоточность помогает, но эффект зависит от формы матрицы.
### Большие матрицы (100000 x 100, 1000000 x 10)
- Однопоточное выполнение становится крайне неэффективным.
- `ForkJoin` даёт лучшие результаты как при подсчёте, так и при сортировке.
- `ThreadPool` работает лучше однопоточного подхода, но хуже `ForkJoin`.
Результат работы программы, по которому можно понять в каких ситуациях какой алгоритм лучше использовать:
### Выводы
1. **Для маленьких матриц**: Однопоточное выполнение предпочтительнее, так как накладные расходы на многопоточность не окупаются.
2. **Для средних матриц**: Подсчёт можно распараллеливать (`ForkJoin` предпочтителен), сортировка зависит от формы матрицы.
3. **Для больших матриц**: Использование `ForkJoin` даёт наилучший результат как для подсчёта, так и для сортировки.
4. **Использование `ThreadPool`** может быть полезно, но его эффективность зависит от конкретных размеров матрицы.
Matrix size: 10 x 1000000
Summation: Single | Sorting: Single -> Average Time: 9 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 11 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 9 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 19 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 6 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 7 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 9 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 8 ms
Matrix size: 100 x 100000
Summation: Single | Sorting: Single -> Average Time: 7 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 7 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 7 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 7 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 6 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 8 ms
Matrix size: 1000 x 10000
Summation: Single | Sorting: Single -> Average Time: 7 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 12 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 10 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 10 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 9 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 9 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 9 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 7 ms
Matrix size: 10000 x 1000
Summation: Single | Sorting: Single -> Average Time: 11 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 17 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 13 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 26 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 19 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 23 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 8 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 7 ms
Matrix size: 100000 x 100
Summation: Single | Sorting: Single -> Average Time: 72 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 69 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 47 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 146 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 127 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 109 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 74 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 59 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 47 ms
Matrix size: 1000000 x 10
Summation: Single | Sorting: Single -> Average Time: 2088 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 1305 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 1203 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 5506 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 4021 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 4943 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 2497 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 1739 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 1435 ms

View File

@@ -0,0 +1,65 @@
Matrix size: 10 x 1000000
Summation: Single | Sorting: Single -> Average Time: 9 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 11 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 9 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 19 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 6 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 7 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 9 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 8 ms
Matrix size: 100 x 100000
Summation: Single | Sorting: Single -> Average Time: 7 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 7 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 7 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 7 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 6 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 8 ms
Matrix size: 1000 x 10000
Summation: Single | Sorting: Single -> Average Time: 7 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 12 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 10 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 10 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 9 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 9 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 9 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 7 ms
Matrix size: 10000 x 1000
Summation: Single | Sorting: Single -> Average Time: 11 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 17 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 13 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 26 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 19 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 23 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 8 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 7 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 7 ms
Matrix size: 100000 x 100
Summation: Single | Sorting: Single -> Average Time: 72 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 69 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 47 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 146 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 127 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 109 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 74 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 59 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 47 ms
Matrix size: 1000000 x 10
Summation: Single | Sorting: Single -> Average Time: 2088 ms
Summation: Single | Sorting: ThreadPool -> Average Time: 1305 ms
Summation: Single | Sorting: ForkJoin -> Average Time: 1203 ms
Summation: ThreadPool | Sorting: Single -> Average Time: 5506 ms
Summation: ThreadPool | Sorting: ThreadPool -> Average Time: 4021 ms
Summation: ThreadPool | Sorting: ForkJoin -> Average Time: 4943 ms
Summation: ForkJoin | Sorting: Single -> Average Time: 2497 ms
Summation: ForkJoin | Sorting: ThreadPool -> Average Time: 1739 ms
Summation: ForkJoin | Sorting: ForkJoin -> Average Time: 1435 ms