1. Обзор
Мы все использовали Arrays.sort () сортировать массив объектов или примитивов. В JDK 8 создатели усовершенствовали API, чтобы предоставить новый метод: Arrays.parallelSort() .
В этом учебнике мы нарисуем сравнение между сортировать () и parallelSort () методика.
2. Arrays.sort()
Arrays.sort () метод сортирует массив объектов или примитивов. Алгоритм сортировки, используемый в этом методе, является Dual-Pivot Квиксорт . Другими словами, это пользовательская реализация алгоритма quicksort для достижения лучшей производительности.
Этот метод является однонитным и есть два варианта:
- сортировать (array) – сортирует полный массив в восходящий порядок
- сортировка (array, отIndex, доИндекса) – сортирует только элементы из отИндекс Кому toIndex
Рассмотрим пример обоих вариантов:
@Test public void givenArrayOfIntegers_whenUsingArraysSortMethod_thenSortFullArrayInAscendingOrder() { int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Arrays.sort(array); assertArrayEquals(expected, array); } @Test public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() { int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; Arrays.sort(array, 2, 8); assertArrayEquals(expected, array); }
Давайте подведем итог плюсы и минусы этого подхода:
Производительность ухудшается для больших наборов данных | Работает быстро на меньших наборах данных |
Несколько ядер системы не используются |
3. Arrays.parallelSort()
Этот метод также сортирует массив объектов или примитивов. Похожи на сортировать () он также имеет два варианта сортировки полного массива и частичного массива:
@Test public void givenArrayOfIntegers_whenUsingArraysParallelSortMethod_thenSortFullArrayInAscendingOrder() { int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Arrays.parallelSort(array); assertArrayEquals(expected, array); } @Test public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() { int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; Arrays.parallelSort(array, 2, 8); assertArrayEquals(expected, array); }
parallelSort () функционально отличается. В отличие от сортировать () , который сортирует данные последовательно, используя один поток, он использует параллельный алгоритм сортировки . Он разбивает массив на подразряды, которые сами сортируются, а затем сливаются.
Для выполнения параллельных задач он использует ФоркДжоин бассейн.
Но мы должны знать, что он использует параллелизм только тогда, когда определенные условия будут выполнены. Если размер массива меньше или равен 8192 или процессор имеет только одно ядро, то он использует последовательный алгоритм Dual-Pivot quicksort. В противном случае он использует параллельный сорт.
Давайте обобщим преимущества и недостатки его использования:
Медленнее для массивов меньшего размера | Предлагает более производительность для больших наборов данных размера |
Использует несколько ядер системы |
4. Сравнение
Давайте теперь посмотрим, как оба метода выполняются с различными наборами данных размера. Ниже приведены цифры с использованием бенчмаркинга JMH. В тестовой среде используется четырехъядерный процессор AMD A10 PRO 2.1Ghz и JDK 1.8.0-221:
1000 | o.048 | 0.054 |
10000 | 0.847 | 0.425 |
100000 | 7.570 | 4.395 |
1000000 | 65.301 | 37.998 |
5. Заключение
В этой быстрой статье мы увидели, как сортировать () и parallelSort () отличаться.
Основываясь на результатах работы, мы можем сделать вывод, что parallelSort () может быть лучшим выбором, когда у нас есть большой набор данных для сортировки. Однако, в случае массивов меньшего размера, лучше идти с сортировать () так как он предлагает лучшую производительность.
Как всегда, полный исходный код доступен более на GitHub .