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

开了并行需要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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(1)
刘奇

Après avoir activé le parallélisme, le tableau d'origine doit être divisé en blocs, accumulés dans chaque bloc, puis fusionnés. Ces opérations supplémentaires prennent du temps. L'accumulation elle-même est une opération linéaire très efficace. Par conséquent, si les données parallèles ne sont pas assez volumineuses ou si les paramètres (tels que le nombre de tâches, etc.) sont définis de manière déraisonnable, cela ne sera pas aussi efficace que l'original

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal