JAVA, bagaimana untuk menambah 100,000 nilai Int dengan lebih cekap
大家讲道理
大家讲道理 2017-05-17 10:02:50
0
2
913

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;
    }
}
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(2)
仅有的幸福

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).

Ty80

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!