Не будет проблемы (проблема, как в неправильном результате), но, как сказано в примечании API ,
Сохранение стабильности для Different () в параллельных конвейерах относительнодорогой
Но если производительность вызывает беспокойство и если стабильность не является проблемой (т. е. результат имеет другой порядок элементов в отношении коллекции, которую он обработал), то вы следуетеПримечание API
, устраняющее ограничение упорядочения с помощью BaseStream.unordered (), может привести к значительно более эффективному выполнению Different () в параллельных конвейерах,
Я подумал, почему неттест производительности параллельных и последовательных потоков для distinct
public static void main(String[] args) {
List<String> strList = Arrays.asList("cat", "nat", "hat", "tat", "heart", "fat", "bat", "lad", "crab", "snob");
List<String> words = new Vector<>();
int wordCount = 1_000_000; // no. of words in the list words
int avgIter = 10; // iterations to run to find average running time
//populate a list randomly with the strings in `strList`
for (int i = 0; i < wordCount; i++)
words.add(strList.get((int) Math.round(Math.random() * (strList.size() - 1))));
//find out average running times
long starttime, pod = 0, pud = 0, sod = 0;
for (int i = 0; i < avgIter; i++) {
starttime = System.currentTimeMillis();
List<String> parallelOrderedDistinct = words.parallelStream().distinct().collect(Collectors.toList());
pod += System.currentTimeMillis() - starttime;
starttime = System.currentTimeMillis();
List<String> parallelUnorderedDistinct =
words.parallelStream().unordered().distinct().collect(Collectors.toList());
pud += System.currentTimeMillis() - starttime;
starttime = System.currentTimeMillis();
List<String> sequentialOrderedDistinct = words.stream().distinct().collect(Collectors.toList());
sod += System.currentTimeMillis() - starttime;
}
System.out.println("Parallel ordered time in ms: " + pod / avgIter);
System.out.println("Parallel unordered time in ms: " + pud / avgIter);
System.out.println("Sequential implicitly ordered time in ms: " + sod / avgIter);
}
Выше было скомпилировано open-jdk 8 и выполнено на jre 8 openjdk (без аргументов, специфичных для jvm) на i3 6-го поколения (4 логических ядра)) и я получил эти результаты
Похоже, после определенного нет.из элементов упорядоченная параллель была быстрее, а по иронии судьбы неупорядоченная была самой медленной.Причиной этого (благодаря @Hulk) является то, как он реализован (с использованием HashSet). Так что общее правило будет таким: если вы используете несколько элементов и много дублирующихся на несколько величин больше, вы можете извлечь выгоду из parallel()
.
1)
Parallel ordered time in ms: 52
Parallel unordered time in ms: 81
Sequential implicitly ordered time in ms: 35
2)
Parallel ordered time in ms: 48
Parallel unordered time in ms: 83
Sequential implicitly ordered time in ms: 34
3)
Parallel ordered time in ms: 36
Parallel unordered time in ms: 70
Sequential implicitly ordered time in ms: 32
Неупорядоченная параллель была в два раза медленнее, чем обе.
Затем я поднял wordCount
до 5_000_000
, и это были результаты
1)
Parallel ordered time in ms: 93
Parallel unordered time in ms: 363
Sequential implicitly ordered time in ms: 123
2)
Parallel ordered time in ms: 100
Parallel unordered time in ms: 363
Sequential implicitly ordered time in ms: 124
3)
Parallel ordered time in ms: 89
Parallel unordered time in ms: 365
Sequential implicitly ordered time in ms: 118
, а затем 10_000_000
1)
Parallel ordered time in ms: 148
Parallel unordered time in ms: 725
Sequential implicitly ordered time in ms: 218
2)
Parallel ordered time in ms: 150
Parallel unordered time in ms: 749
Sequential implicitly ordered time in ms: 224
3)
Parallel ordered time in ms: 143
Parallel unordered time in ms: 743
Sequential implicitly ordered time in ms: 222