forked from sevastyan_b/SSPR_25
Внёс правки
This commit is contained in:
@@ -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
|
||||
65
pokladov_nikita_lab_1/res.txt
Normal file
65
pokladov_nikita_lab_1/res.txt
Normal 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
|
||||
Reference in New Issue
Block a user