• 代码性能提升10倍(ForkJoin)


    package com.lyl.test;
    
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Random;
    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.RecursiveTask;
    
    /**
     * @Auther: lyl
     * @Date: 2020/03/31 11:06
     * @Description:
     */
    public class Test6 {
        int[] nums = new int[10_000_0000];
        int CI = 10;//计算多少次
        Random r = new Random();
    
        public Test6() {
            for (int i = 0; i < nums.length; i++) {
                nums[i] = r.nextInt(10);
            }
        }
    
        public static void main(String[] args) throws IOException {
    //        Arrays.stream(new int[3]).sum();//初始化sum内部排除初始化时间
    
            Test6 t = new Test6();
            t.aa();
            t.bb();
            t.cc();
        }
    
        public void aa() {
    
    
            long start = System.currentTimeMillis();
            long n = 0;
            for(int i = 0; i< CI; i++) {
                n = Arrays.stream(nums).sum();
            }
            long end = System.currentTimeMillis();
            System.out.println("aa|"+ (end - start )+ "ms|" + n);
        }
    
        public void bb() {
            long start = System.currentTimeMillis();
            long n = 0;
            for(int j = 0; j< CI; j++) {
                n = 0;
                for (int i = 0; i < nums.length; i++) {
                    n += nums[i];
                }
            }
    
            long end = System.currentTimeMillis();
            System.out.println("bb|"+ (end - start )+ "ms|" + n);
        }
    
    
        public void cc() throws IOException {
            Long invoke = 0L;
            ForkJoinPool pool = new ForkJoinPool();
            AddTask task = new AddTask(0,nums.length);
            long start = System.currentTimeMillis();
            for(int j = 0; j< CI; j++) {
    //            pool.execute(task);
                invoke = pool.invoke(task);
            }
    
    //        long s = task.join();
            long end = System.currentTimeMillis();
    
            System.out.println("cc|"+ (end - start )+ "ms|" + invoke);
            System.in.read();
        }
    
        class AddTask extends RecursiveTask<Long> {
    
            int start;
            int end;
    
            public AddTask(int s,int e){
                this.start = s;
                this.end = e;
            }
    
            @Override
            protected Long compute() {
    
                if(end - start <= 50000){
                    long sum = 0L;
                    for(int i = start;i< end ;i++){
                        sum += nums[i];
    
                    }
                    return sum;
                }
                int m = start +(end-start)/2;
    
                AddTask sub1 = new AddTask(start,m);
                AddTask sub2 = new AddTask(m,end);
                sub1.fork();
                sub2.fork();
    
                return sub1.join()+sub2.join();
    
            }
        }
    }

  • 相关阅读:
    miniui表格设置百分比不生效
    sql delete删除不存在的记录 提示成功,如何判断sql执行成功
    共享程序集和强命名程序集(下)
    共享程序集和强命名程序集(上)
    生成、打包、部署和管理应用程序及类型(下)
    生成、打包、部署和管理应用程序及类型(上)
    clr的执行模型(下)
    clr的执行模型(中)
    使用时间戳解决缓存问题
    sql修改字段类型为clob
  • 原文地址:https://www.cnblogs.com/liaoyanglong/p/12603801.html
Copyright © 2020-2023  润新知