`
xkorey
  • 浏览: 151365 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

答复: 淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和

阅读更多
经过测试我发现我写的这个实现还不如java ArrayList 直接遍历相加求和快呢。
数据量大了更是如此吧。
import java.util.ArrayList;
import java.util.Random;


public class countBasic {

    public static void main(String[]a){

      int index = 100000;
      ArrayList<Integer> numbers = new ArrayList<Integer>();

      ArrayList<RunnableBasic> obj = new ArrayList<RunnableBasic>();
      System.out.println("开始生成数组"+System.currentTimeMillis());
        for(int i=0;i<1000*100*10;i++){
          Random rd = new Random();
          int t = rd.nextInt();
          numbers.add(t>0?t:0-t);      
         }

        System.out.println("生成完毕"+System.currentTimeMillis());

        ArrayList<Integer> arr = new ArrayList<Integer>();

        for(int j =0;j<numbers.size();j++){

           arr.add(numbers.get(j));

           if((j %  index== 0 && j != 0 )|| (j == numbers.size()-1)){
              
              RunnableBasic rb = new RunnableBasic();

              rb.vt = new smallBasic();

              rb.Numbers = arr;

              obj.add(rb);

              arr = new ArrayList<Integer>();

           }

        }

        ArrayList<Thread> th  = new ArrayList<Thread>();
        System.out.println("分组完毕"+System.currentTimeMillis());
        for(int k = 0 ; k<obj.size();k++){
            new Thread(obj.get(k)).start();
        }
       
        boolean end = false;

        while(!end){
            int m = 0;
            for(int q=0;q<obj.size();q++){
                if(obj.get(q).end.equals("end")){
                    m++;
                }
            }
            if(m == obj.size()){end = true;}
        }

        Sumcenter s = Sumcenter.getInistance();

        int sum = 0;

        for(int u=0;u<s.get().size();u++){
           sum += s.get().get(u);
        }

        System.out.println("和是:"+sum);
        System.out.println("计算完毕"+System.currentTimeMillis());
        int au = 0;
        for(int aj =0;aj<numbers.size();aj++){
            // System.out.println(numbers.get(aj));
            au += numbers.get(aj);
        }
        System.out.println("和是:"+au);
        System.out.println(System.currentTimeMillis());
    }


}


import java.util.ArrayList;

public class Sumcenter {
   
    public ArrayList<Integer> Brain;

    private static Sumcenter c;
   
    private Sumcenter(){
        Brain = new ArrayList<Integer>();
    }

    public static Sumcenter getInistance(){
       if(c == null)
           c = new Sumcenter();
        return c;
    }

    public void add(int i){
        Brain.add(i);
    }

    public ArrayList<Integer> get(){
        return Brain;
    }
}

public class smallBasic {
   
    private int sum=0;

    public void add(int i){
      this.sum += i; 
    }

    public int getSum(){
        return this.sum;
    }
   
}

public class RunnableBasic implements Runnable {

    protected smallBasic vt;
   
    protected ArrayList<Integer> Numbers;

    protected String end ="";

    public void run() {
        for(int i=0;i<Numbers.size();i++){
           vt.add(Numbers.get(i));
        }
        Sumcenter c = Sumcenter.getInistance();
        c.add(vt.getSum());
        end = "end";
    }
   
}

开始生成数组1279266504921
生成完毕1279266505734
分组完毕1279266505843
和是:-1912057435
计算完毕1279266505875
和是:-1912057435
1279266505890

直接遍历相加所用时间:15
分组遍历多线程在求和所用时间:141
希望大家看看我写的代码哪里出问题了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics