https://github.com/yawkar/matrix-search-benchmark
(Student Lab Project) Benchmarking of several search algorithms over matrices generated by specific generators
https://github.com/yawkar/matrix-search-benchmark
java jmh-benchmarks lab
Last synced: 11 months ago
JSON representation
(Student Lab Project) Benchmarking of several search algorithms over matrices generated by specific generators
- Host: GitHub
- URL: https://github.com/yawkar/matrix-search-benchmark
- Owner: YawKar
- Created: 2022-10-26T10:49:51.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2024-08-21T14:35:41.000Z (almost 2 years ago)
- Last Synced: 2025-03-21T06:33:24.829Z (over 1 year ago)
- Topics: java, jmh-benchmarks, lab
- Language: Java
- Homepage:
- Size: 345 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Реализации трёх алгоритмов
### Линейный
_Реализация:_
https://github.com/YawKar/matrix-search-benchmark/blob/4dacc2592fbadad7553f94c5811a11c60d688ce6/src/main/java/dev/yawkar/algorithm/impl/LinearSearch.java#L8-L21
_Асимптотика:_ O(M+N), M x N
### Бинарный
_Реализация:_
https://github.com/YawKar/matrix-search-benchmark/blob/4dacc2592fbadad7553f94c5811a11c60d688ce6/src/main/java/dev/yawkar/algorithm/impl/BinaryOnRowLinearOnColumnSearch.java#L5-L34
_Асимптотика:_ O(Mlog(N)), M x N
### Экспоненциальный + Бинарный
_Реализация:_
https://github.com/YawKar/matrix-search-benchmark/blob/4dacc2592fbadad7553f94c5811a11c60d688ce6/src/main/java/dev/yawkar/algorithm/impl/ExpBinaryOnRowLinearOnColumnSearch.java#L5-L43
_Асимптотика:_ ~O(Mlog(N)), M x N
# Реализации двух генераций данных
### Alpha `matrix[i][j] = (N/M * i + j) * 2`
_Реализация:_
https://github.com/YawKar/matrix-search-benchmark/blob/ade5e61ed2ded29ebb2068f9cd41a351266a4ea6/src/main/java/dev/yawkar/matrix/generator/AlphaGenerator.java#L8-L16
### Beta `matrix[i][j] = (N/M * i * j) * 2`
_Реализация:_
https://github.com/YawKar/matrix-search-benchmark/blob/ade5e61ed2ded29ebb2068f9cd41a351266a4ea6/src/main/java/dev/yawkar/matrix/generator/BetaGenerator.java#L8-L16
# Полученные замеры
Замеры производились с помощью Java Microbenchmark Harness: https://github.com/openjdk/jmh
https://github.com/YawKar/matrix-search-benchmark/blob/fe2b4cce473d210c4d585b3f5a63a228ee822d6b/sample_results.txt#L1-L79
# Визуализация
## Производительность на матрицах AlphaGenerator (Linear)

## Производительность на матрицах AlphaGenerator (SemiLog)

## Производительность на матрицах BetaGenerator (Linear)

## Производительность на матрицах BetaGenerator (SemiLog)

# Выводы
- Во всех тестовых случаях линейный алгоритм, ожидаемо, работает быстрее, за исключением лишь тестов матриц `2x8192, ..., 1024x8192`,
сгенерированных BetaGenerator (`matrix[i][j] = (N/M * i * j) * 2`)
- Почему быстрее в большинстве случаев: у него минимальная константа и сама асимптотика в `log` раз меньше
- Почему медленнее на вышеуказанных Beta матрицах: так как `target = const = 16*N + 1 = 16 * 8192 + 1 = 131073` и числа,
близкие к нему, находятся практически в начале второй строчки уже в матрице `2x8192`, не говоря уже и о больших. Бинарный и экспоненциальный
поиски быстрее приходят к началу, а линейный ещё должен успеть обойти `~8000` элементов, чтобы только дойти до начала второй строки
- На Alpha матрицах бинарный и экспоненциальный идут рука об руку вплоть до матрицы `4096x8192`, на которой ситуация резко меняется.
Бинарный начинает работать сильно хуже, чем экспоненциальный.
- Почему так: всё просто - экспоненциальный растёт с этого момента уже только за счёт линейного спуска вниз, т.е. сам экспоненциальный
поиск закончился, дальше все идёт линейно вниз (либо вырождается в бинарный на малых масштабах, см. реализацию экспоненциального+бинарного).
А вот бинарный начинает буксовать, потому что постоянно двигается влево на 1, но тратя на это `log(префикс текущей строки)` операций, а спускается
всё так же, как это делает эксп+бин