并行操作测试

来源:互联网 发布:西部世界什么意思 知乎 编辑:程序博客网 时间:2024/06/05 14:11
import org.junit.Test;import java.util.function.Consumer;import java.util.stream.LongStream;import java.util.stream.Stream;/** * Created by ibm on 2017/4/24. * 并行操作:选择适当的数据结构比优秀的算法与实现更加重要。 * 什么时候采用并行: * 1.在没有自动装箱拆箱的的操作情况下。 * 2.对结果没有顺序的要求下,元素的顺序操作在并行流的执行下,代价非常大。 * 3.对单个元素的操作消费较高的时候,如果单个操作成本很低,那么开启线程的操作话费是不值当的。 * 4.数据量大的情况,数据量小的话,并行并不是一个好方法。 * 5.数据源的类型为:arrayList,IntStream,HashSet,TreeSet时效率较好,LinkedList与Stream.iterate时效率低下。 */public class ParallelExercise {    //比较顺序流,并行流,迭代的性能    @Test    public void exercise(){        Integer num = 10000000;        ParallelStream parallelStream = new ParallelStream();        System.out.println("sequentialSum = ");        testPerformance((Integer parallelSum) -> parallelStream.sequentialSum(num),num);        System.out.println("parallelSum = ");        testPerformance((Integer parallelSum) -> parallelStream.parallelSum(num),num);        System.out.println("iterativeSum = ");        testPerformance((Integer parallelSum) -> parallelStream.iterativeSum(num),num);        System.out.println("longStreamSequential = ");        testPerformance((Integer parallelSum) -> parallelStream.longStreamSequential(num),num);        System.out.println("longStreamParallel = ");        testPerformance((Integer parallelSum) -> parallelStream.longStreamParallel(num),num);    }    private <T> void testPerformance(Consumer<T> parallelStream,T num){        long startTime = System.nanoTime();        parallelStream.accept(num);        long endTime = System.nanoTime();        System.out.println((endTime - startTime)/1000000 + "ms");    }    class ParallelStream{        //串行        public long sequentialSum(long n){            return Stream.iterate(1l,i -> i + 1).limit(n).reduce(0l,Long::sum);        }        //并行        public long parallelSum(long n){            return Stream.iterate(1l,i -> i + 1).limit(n).parallel().reduce(0l,Long::sum);        }        //迭代        public long iterativeSum(long n){            long result = 0l;            for(long i = 0;i < n;i++){                result += i;            }            return result;        }        //longStream串行        public long longStreamSequential(long n){            return LongStream.rangeClosed(1,n).sum();        }        //longStream并行        public long longStreamParallel(long n){            return LongStream.rangeClosed(1,n).parallel().sum();        }    }}
0 0
原创粉丝点击