我正在尝试代码以检查stream()
和parallelStream()
用于相同操作的时间。在相同的数据和任务上再次处理java 8流时是否重用自身?
代码1
List <String> list = new ArrayList <String>();
for (int i = 1; i <= 30000; i++)
list.add("a");
for (int i = 1; i <= 20000; i++)
list.add("b");
for (int i = 1; i <= 10000; i++)
list.add("c");
//part 1
long start = System.currentTimeMillis();
Map <String, Long> countListSequence = list.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end = System.currentTimeMillis();
System.out.println("Time taken in by stream() " + (end - start) + " millisec data " + countListSequence);
//part 2
long start1 = System.currentTimeMillis();
Map <String, Long> countListparallel = list.parallelStream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end1 = System.currentTimeMillis();
System.out.println("Time taken by parallelStream() " + (end1 - start1) + " millisec data " + countListparallel);
输出1
Time taken in by stream() 109 millisec data {a=30000, b=20000, c=10000}
Time taken by parallelStream() 16 millisec data {a=30000, b=20000, c=10000}
但是,如果我的顺序改变了第一使用parallelStream()
然后stream()
像
代码2
//part 1
long start1 = System.currentTimeMillis();
Map <String, Long> countListparallel = list.parallelStream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end1 = System.currentTimeMillis();
System.out.println("Time taken by parallelStream() " + (end1 - start1) + " millisec data " + countListparallel);
//part 2
long start = System.currentTimeMillis();
Map <String, Long> countListSequence = list.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end = System.currentTimeMillis();
System.out.println("Time taken in by stream() " + (end - start) + " millisec data " + countListSequence);
输出2
Time taken by parallelStream() 109 millisec data {a=30000, b=20000, c=10000}
Time taken in by stream() 15 millisec data {a=30000, b=20000, c=10000}
我的问题是,为何第二部分stream()
在代码2正在更少的时间然后parallelStream()
示出从代码1不同的行为?
不仅在stream()
和parallelStream()
的情况下,我也试过同样的情况与stream()
和stream()
。我得到了相同的情况下与也,第二个流是少于第一流。
代码3
//part 1
long start1 = System.currentTimeMillis();
Map <String, Long> countListparallel = list.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end1 = System.currentTimeMillis();
System.out.println("Time taken by stream() 1 " + (end1 - start1) + " millisec data " + countListparallel);
//part 2
long start = System.currentTimeMillis();
Map <String, Long> countListSequence = list.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end = System.currentTimeMillis();
System.out.println("Time taken in by stream() " + (end - start) + " millisec data " + countListSequence);
输出3
Time taken by stream() 1 107 millisec data {a=30000, b=20000, c=10000}
Time taken in by stream() 14 millisec data {a=30000, b=20000, c=10000}
第二印刷表现出了较少的时间,然后first.So不stream
计算数据重用自己,如果我会相信,这怎么可能可能是因为创建的对象countListSequence
和countListparallel
是不同的。我很困惑这里每个代码示例中的第二部分t第一部分减少时间。 我在这里为溪流增添了些什么?
感谢
这可能是由于第一次调用lambda涉及:它需要时间。用JMH创建一个适当的基准并比较结果。 – Tunaki