Java是否自动优化多核处理器的循环

时间:2015-05-05 19:29:36

标签: java for-loop optimization multiprocessing

一位开发人员今天告诉我,Java(或JIT)可以自动优化for循环的执行,以便它使用计算机上的所有可用CPU,只要for循环的每次迭代中的代码都是如此。可以执行而不依赖于在循环的先前迭代中修改的变量。

这是多么荒谬的一厢情愿,还是有任何道理?

4 个答案:

答案 0 :(得分:3)

不,它没有。 JVM必须证明你的for循环体可以安全地并行化,这是一个非常复杂的问题。

如果您对并行化某些逻辑感兴趣,可以查看Java 8 Stream API及其对并行流的支持。

答案 1 :(得分:2)

不,Java不会这样做。

这可以通过编写一个可以完成某项工作的简单程序来验证,并检查有多少CPU核心忙。

这样的事情:

public static void main(String[] args) throws Exception {
    for (int i = 0 ; i < 1000000 ; i++) {
        String s = "this XXX a test".replaceAll("XXX", " is ");
    }
}

运行此操作时,您将看到仅使用 一个CPU核心。如果要并行化这样的东西,则需要使用多个线程,这可以使用Java 8 Stream API完成,也可以使用ExecutorService轻松完成。

答案 2 :(得分:1)

我想你的同伴可能会指的是Java 7中的Fork / Join。 请看看这个: https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

请注意,如果您查看Java 7/8的功能,您会注意到大多数功能的主要目标是多核的性能和使用。像Fork / Join,Parallel Array Sorting(基于Fork和Join)和其他功能

答案 3 :(得分:1)

截至目前,似乎确实已经完成了。我正在测试一个程序,该程序有三个完全普通的嵌套for循环,将一个2d数组复制到另一个2d数组10次以平均可变性。在运行时,程序扩展为使用从活动监视器查看的机器上的所有核心。  然后我使用time命令来测量cpu和进程的实时时间并得到以下结果:

$ time java ArraysTest

real    0m17.562s
user    1m9.429s
sys     0m1.775s

我能看到它可能比实时使用更多用户时间的唯一方法是使用多个cpu内核。由此我得得出结论,java通过并行化来优化代码。