Разница между массивами Array.sort() и Arrays.parallelSort()
Проходил Java 8
функции, упомянутые здесь. Не удалось понять, что именно делает parallelSort()
. Может ли кто-нибудь объяснить, какова фактическая разница между sort()
и parallelSort()
?
Ответы
Ответ 1
Параллельная сортировка использует потоки. Это быстрее, когда есть элементы много. Накладные расходы для распараллеливания становятся более малыми на больших массивах, но они большие для небольших.
Взгляните на эту таблицу (конечно, результаты зависят от процессора, фоновых процессов и т.д.):
Взято по этой ссылке: http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
Ответ 2
Arrays.parallelSort():
Метод использует пороговое значение, а любой массив размером меньше порогового значения сортируется с использованием API сортировки Array # sort() (то есть последовательной сортировки). И порог рассчитывается с учетом parallelism машины, размера массива и рассчитывается как:
private static final int getSplitThreshold(int n) {
int p = ForkJoinPool.getCommonPoolParallelism();
int t = (p > 1) ? (1 + n / (p << 3)) : n;
return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t;
}
После того, как оно решило, нужно ли сортировать массив параллельно или последовательно, его теперь нужно решить, как разделить массив на несколько частей, а затем назначить каждую часть задаче Fork/Join, которая позаботится о ее сортировке, а затем другая задача Fork/Join, которая позаботится о слиянии отсортированных массивов. Реализация в JDK 8 использует этот подход:
-
Разделите массив на 4 части.
-
Сортируйте первые две части, а затем объедините их.
-
Отсортируйте следующие две части, а затем объедините их. И вышеупомянутые шаги повторяются рекурсивно с каждой частью до тех пор, пока размер сортируемой части не будет меньше порогового значения, вычисленного выше.
Вы также можете прочитать подробности реализации в Javadoc
Алгоритм сортировки представляет собой параллельное сортирование-слияние, которое разбивает массив на под-массивы, которые сами сортируются и затем объединяются. Когда длина поддиапазона достигает минимальной детализации, подматрица сортируется с использованием соответствующего метода Arrays.sort. Если длина указанного массива меньше минимальной гранулярности, то она сортируется с использованием соответствующего метода Arrays.sort. Алгоритм требует рабочего пространства, не превышающего размер указанного диапазона исходного массива. Общий пул ForkJoin используется для выполнения любых параллельных задач.
Array.sort():
Для сортировки содержимого используется сортировка слияния или сортировка по типу. Все это выполняется последовательно, хотя сортировка слияния использует метод разделения и покорения, все это выполняется последовательно.
Источник
Ответ 3
Ключевыми различиями между обоими алгоритмами являются следующие:
1. Arrays.sort(): это последовательная сортировка.
- API использует один поток для операции.
- Для выполнения операции API занимает больше времени.
2. Arrays.ParallelSort(): параллельная сортировка.
API использует несколько потоков.
- API занимает меньше времени по сравнению с Sort().
Для получения дополнительных результатов мы все должны ждать JAVA 8, я думаю! приветствия!
Ответ 4
Вы можете обратиться к javadoc, в котором объясняется, что алгоритм использует несколько потоков, если массив достаточно велик:
Алгоритм сортировки представляет собой параллельное сортирование-слияние, которое разбивает массив на под-массивы, которые сами сортируются и затем объединяются. Когда длина подматрицы достигает минимальной детализации, подматрица сортируется с использованием соответствующего метода Arrays.sort
. [...] Общий пул ForkJoin
используется для выполнения любых параллельных задач.
Ответ 5
Вкратце, parallelSort
использует несколько потоков. Этот article имеет более подробную информацию, если вы действительно хотите знать.
Ответ 6
Из этого ссылка
Текущие реализации сортировки, предоставляемые коллекциями Java Framework (Collections.sort и Arrays.sort) выполняют сортировку последовательно выполняются в вызывающем потоке. Это предложить тот же набор операций сортировки, который в настоящее время предоставляется Класс массивов, но с параллельной реализацией, которая использует Форк/Объединение. Эти новые API все еще синхронны с учетом к вызывающему потоку, поскольку он не пройдет мимо сортировки до завершения параллельной сортировки.
Ответ 7
Array.sort(myArray);
Теперь вы можете использовать -
Arrays.parallelSort(myArray);
Это автоматически разбивает целевую коллекцию на несколько частей, которые будут отсортированы независимо друг от друга по нескольким ядрам и затем сгруппированы вместе. Единственное предостережение в том, что при вызове в многопоточных средах, таких как загруженный веб-контейнер, преимущества этого подхода начнут уменьшаться (более чем на 90%) из-за стоимости увеличенных переключателей контекста процессора.
Source- ссылка
Ответ 8
Arrays.sort() использует одиночный поток для сортировки элементов, но Arrays.ParallelSort() будет использовать несколько потоков.
parallelsort займет меньше времени по сравнению с обычной сортировкой.