java - 这段代码开了并行为什么变慢了?
高洛峰
高洛峰 2017-04-17 17:48:22
0
1
513

开了并行需要17秒左右,把.parallel()去掉后只用5秒左右(i5双核)

public static void main(String[] args)
{
    long start = System.currentTimeMillis();
    long ret = new Random().longs(0, 10)
                        .limit(10000 * 10000)
                        .parallel()
                        .sum();
    long end = System.currentTimeMillis();
    System.out.println(ret);
    System.out.println("takes " + (end - start) + "ms");
    }
}

然后把代码中的stream改成用range而不用random生成随机数流,则是开并行要比不开并行快一倍(300ms:600ms):

public static void main(String[] args)
{
    long start = System.currentTimeMillis();
    long ret = IntStream.range(0, 1000000000)
                        .parallel()
                        .sum();
    long end = System.currentTimeMillis();
    System.out.println(ret);
    System.out.println("takes " + (end - start) + "ms");
    }
}

为什么前一个例子开并行会更慢,是random类的缘故吗?望指教!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(1)
刘奇

開了並行之後需要對原數組進行分塊,在每塊內執行累加,然後再合併,這些額外操作都是需要時間的。而累加本身就是線性運算非常有效率。所以,如果平行的資料不夠大,或是參數(例如任務數等)設定不合理,反而不如原來效率高

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!