一位开发人员今天告诉我,Java(或JIT)可以自动优化for循环的执行,以便它使用计算机上的所有可用CPU,只要for循环的每次迭代中的代码都是如此。可以执行而不依赖于在循环的先前迭代中修改的变量。
这是多么荒谬的一厢情愿,还是有任何道理?
答案 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通过并行化来优化代码。