Рубрики
Без рубрики

Arrays.sort vs Arrays.parallelSort

Узнайте, чем отличаются сортировка Java () и parallelSort().

Автор оригинала: baeldung.

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 .