2015-11-06 53 views
1

我正在尝试代码以检查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计算数据重用自己,如果我会相信,这怎么可能可能是因为创建的对象countListSequencecountListparallel是不同的。我很困惑这里每个代码示例中的第二部分t第一部分减少时间。 我在这里为溪流增添了些什么?

感谢

+3

这可能是由于第一次调用lambda涉及:它需要时间。用JMH创建一个适当的基准并比较结果。 – Tunaki

回答

3

这一点都不奇怪,因为在JVM中的JIT编译器优化,已运行的次数显著数字代码。因此,程序后期的代码运行速度比程序中的代码更早是非常正常的。

如果你想在这里实际有用的数据,写与像江铃控股的工具占JIT热身的基准。

相关问题