cari

Rumah  >  Soal Jawab  >  teks badan

JAVA, bagaimana untuk menambah 100,000 nilai Int dengan lebih cekap

Bagaimana untuk menambah 100,000 nilai int dengan lebih cekap?
Saya sedang mengumpulkan soalan temuduga hari ini dan melihat soalan ini yang ditanya sebelum ini.
Berfikir sia-sia
Semua orang dialu-alukan untuk berbincang!

Saya mencubanya semalam berdasarkan jawapan fonxian dan mendapati tiada perbezaan! Ada yang salah dengan pelaksanaan saya?
Algoritma menggunakan benang mungkin lebih perlahan kerana benang memerlukan overhed tambahan.
Bagi yang guna map, abaikan saja Versi map dah banyak kali tukar tapi masih tak dapat kesan yang diingini Nampak sangat mahal.
Tiada perbezaan antara pengiraan berasingan dan pengiraan gabungan Manfaat pengiraan berasingan tidak jelas sama sekali~~~~

2017-5-10
Terima kasih kepada thomastao atas peringatan, saya menyusun semula kaedah, dan dapat dilihat bahawa terdapat petunjuk. Tahap saya terhad jadi saya tidak akan meringkaskannya. Lihat sahaja!

public static void main(String[] args) {
        IntSumTest t = new IntSumTest(10000000);
        Long startDate1 = new Date().getTime();
        //方法注释后的数值为执行时间(毫秒)
        //先用map去重,然后相乘。最后将结果相加
        t.mapCount();     //7255 8251 8002 7355
        //开启多个线程相加,结果记录到sum数组中。最后将sum数组相加。
//        t.threadCount();  //5 5 4 4 5 4 5 4 4 4
        //一个线程相加分10次相加,结果记录到sum数组中。最后将sum数组相加。
//        t.reduceCount();  //4 2 3 3 3 3 4 3 2 3
        //直接相加
//        t.count();        //11 10 10 10 10 10 12 13 11 11
        //使用计数方法
//        t.countSum();     //14 15 14 16 12 13 11 12 12 13
        Long endDate1 = new Date().getTime();
        System.out.println(endDate1- startDate1 );
    }
public class IntSumTest {
    int[] valueNum = new int[10000000];//1000w个数

    public IntSumTest(int maxNum){
        Random r = new Random();
        for(int i=0;i<valueNum.length;i++){
            valueNum[i] = r.nextInt(maxNum);
        }
    }

    /**
     * 直接计算
     * @return
     */
    public long count(){
        long sum = 0;
        for(int i=0;i<valueNum.length;i++){
            sum+= valueNum[i];
        }
        return sum;
    }
    /**
     * 使用计数方法计算
     * 理论上的好处在于java栈内的管理方式是所有成员变量都会记录
     * @return
     */
    public long countSum(){
        long sum = 0;
        for(int i=0;i<valueNum.length;i++){
            sum = sum( sum,valueNum[i]);
        }
        return sum;
    }
    public long sum(long sum ,int num){
        return sum+num;
    }
    /**
     * 使用数组计数,然后在各个数字相乘,得到结果
     * 该方法的好处在于可以释放大量对象
     * 缺点在于,如果数字的分布范围太大,效果就不明显
     */
    public long mapCount(){
        long sum = 0;
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<valueNum.length;i++){
            map.put(valueNum[i],map.get(valueNum[i])==null?0:map.get(valueNum[i])+1);
        }
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            sum+= entry.getKey()*entry.getValue();
        }
        return sum;
    }
    /**
     * 多线程计算,分10组计算,分别汇总结果
     */
    public long threadCount(){
        long sum = 0;
        long[] sumNum = new long[10];
        for (int i = 0; i < 10; i++) {
            MyThread my = new MyThread(sumNum,valueNum,i);
            my.run();
        }
        for (int i = 0; i < 10; i++) {
            sum += sumNum[i];
        }
        return sum;
    }
    /**
     * 分10组计算,分别汇总结果
     */
    public long reduceCount(){
        long sum = 0;
        long[] sumNum = new long[10];
        for (int i = 0; i < 10; i++) {
            int temp = i*10000;
            long max = temp+10000;
            for (int j = temp; j < max; j++) {
                sumNum[i]+= valueNum[j];
            }
        }
        for (int i = 0; i < 10; i++) {
            sum += sumNum[i];
        }
        return sum;
    }
}
大家讲道理大家讲道理2775 hari yang lalu1060

membalas semua(2)saya akan balas

  • 仅有的幸福

    仅有的幸福2017-05-17 10:04:50

    Gunakan idea MapReduce atau multi-threading untuk menyelesaikannya. 100,000 integer dipetakan ke dalam n kumpulan (contohnya, 10 kumpulan hanya perlu mengira jumlah 10,000 nombor, dan kemudian mengurangkan dan menambah 10 jumlah).

    balas
    0
  • PHP中文网

    PHP中文网2017-05-17 10:04:50

    Secara umum, semak dahulu dengan mata kasar sama ada terdapat corak, gunakan formula untuk mengira jika tiada corak, tambah satu persatu. . .

    balas
    0
  • Batalbalas