Рубрики

Серийная сортировка v / s Параллельная сортировка в Java

Нам часто нужно сортировать массив при программировании. Для этого мы используем встроенный метод, предоставленный Java в классе Arrays, т.е. sort (). Метод sort () использует сортировку слиянием или Tim Sort для сортировки элементов массива. В обоих случаях метод sort () последовательно сортирует элементы массива.

В Java 8 появился новый API для сортировки, который называется параллельной сортировкой.

В Parallel Sort используется среда Fork / Join, представленная в Java 7, для назначения задач сортировки нескольким потокам, доступным в пуле потоков. Fork / Join реализует алгоритм кражи работы, при котором в свободном потоке можно красть задачи, поставленные в очередь в другом потоке.

Например, следующий код представляет собой программу, которая сортирует рандомизированный массив значений типа double с использованием Arrays.sort () и Arrays.parallelSort () . Эта программа просто измеряет разницу в производительности между этими двумя подходами. :

// Java-программа для демонстрации времени, затраченного на sort ()
// и parallelSort () методы.

import java.util.Arrays;

  

public class ParallelSortTest

{

    private static final int BASE_ARRAY_SIZE = 10000;

  

    // Вспомогательная функция для генерации и возврата

    // массив заданного размера, заполненный случайным образом

    // сгенерированные элементы.

    public static double[] generateArray(int size)

    {

        if (size <= 0 || size > Integer.MAX_VALUE)

            return null;

  

        double[] result = new double[size];

        for (int i = 0; i < size; i++)

            result[i] = Math.random();

  

        return result;

    }

  

    // Код драйвера для сравнения двух сортировок

    public static void main(String[] args)

    {

        for (int i = 1; i < 10000; i *= 10)

        {

            int size = BASE_ARRAY_SIZE * i;

            double[] arr1 = generateArray(size);

  

            // Создание копии arr1, чтобы мы могли

            // использовать один и тот же контент для обеих сортировок.

            double[] arr2 = Arrays.copyOf(arr1, arr1.length);

            System.out.println("Array Size: " + size);

  

            // сортировка arr1 [] с использованием последовательной сортировки

            long startTime = System.currentTimeMillis();

            Arrays.sort(arr1);

            long endTime = System.currentTimeMillis();

            System.out.println("Time take in serial: " +

                             (endTime - startTime) + "ms.");

  

            // сортировка arr2 [] с использованием последовательной сортировки

            startTime = System.currentTimeMillis();

            Arrays.parallelSort(arr2);

            endTime = System.currentTimeMillis();

            System.out.println("Time take in parallel: "

                            + (endTime - startTime) + "ms.");

            System.out.println();

        }

    }

}

Окружающая обстановка :

2.6 GHz Intel Core i7
java version "1.8.0_25"

Примечание. Требуемое время может варьироваться в зависимости от случайных значений в массиве.

Ключевые различия между обоими алгоритмом заключаются в следующем:

1) Arrays.sort () : последовательная сортировка.

  • API использует один поток для операции.
  • Операция занимает немного больше времени.

2. Arrays.ParallelSort (): это параллельная сортировка.

  • API использует несколько потоков для операции.
  • Это быстрее, когда много элементов, тогда как медленнее для меньших элементов.

Анализ:
Результаты показывают, что параллельная сортировка на многоядерном компьютере может обеспечить повышение производительности на 1 миллион и более элементов. Хотя ниже этого порога, он может быть медленнее, чем последовательная сортировка. Этот результат соответствует ожиданиям, и подходящий размер здесь может составлять 1 миллион. Ваш пробег может варьироваться, это зависит от вашей среды.

Пояснение:
Теперь давайте посмотрим на код, чтобы выяснить, как работает эта параллельная сортировка.

    public static void parallelSort(double[] a) {
        int n = a.length, p, g;
        if (n <= MIN_ARRAY_SORT_GRAN ||
            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
            DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);
        else
            new ArraysParallelSortHelpers.FJDouble.Sorter
                (null, a, new double[n], 0, n, 0,
                 ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
                 MIN_ARRAY_SORT_GRAN : g).invoke();
    }

Как мы видим, существует минимальная гранулярность (java.util.Arrays.MIN_ARRAY_SORT_GRAN = 8192 [0x2000]), и если длина массива меньше минимальной гранулярности, она сортируется непосредственно с использованием DualPivotQuicksort.sort вместо раздел сортировки задач. Как правило, использование меньших размеров приводит к конфликту памяти между задачами, что делает параллельное ускорение маловероятным.

Другим заметным дополнением является ForkJoinPool.getCommonPoolParallelism (), который возвращает целевой уровень параллелизма общего пула (по умолчанию, равный количеству доступных процессоров Runtime.getRuntime (). AvailableProcessors ()). И если ваша машина имеет только 1 рабочий поток, она также не будет использовать параллельные задачи.

Когда длина массива достигает минимальной степени детализации и вы получили более 1 рабочего потока, массив сортируется с использованием метода параллельной сортировки . И общий пул ForkJoin здесь используется для выполнения параллельных задач.

Ссылка :
http://download.java.net/lambda/b84/docs/api/java/util/Arrays.html#parallelSort%28int

Эта статья предоставлена Saumya Mishra . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Серийная сортировка v / s Параллельная сортировка в Java

0.00 (0%) 0 votes