Java乘法优化

时间:2018-04-18 23:00:10

标签: java eclipse x86

我目前正在研究将有数十万次迭代的代码,并想知道现代Java编译器是否在优化到汇编期间自动处理中间值。 例如,我在循环中有以下代码(简化):

arrayA[i] += doubleA*doubleB;
arrayB[i] += doubleA*doubleB;

现代Java编译器是否“智能”足以将doubleA * doubleB存储到乘法寄存器中(然后继续读取第二个数组的乘法寄存器,避免第二个浮点运算)?或者,我会更好地使用以下内容:

double product = doubleA*doubleB;
arrayA[i] += product;
arrayB[i] += product;

对于第二个选项,我主要关注Java垃圾收集器每次超出范围时处理产品变量的开销。

2 个答案:

答案 0 :(得分:2)

如果您运行代码数百万次,那么代码很可能是JIT编译的。如果你想查看JIT输出,并确认它是本机编译的,你可以enable that with a JVM flag(你还必须事先编译一个库(由于许可问题,库没有预先打包) ))。

当JIT将代码编译为本机机器代码时,它通常会对代码执行优化。随着时间的推移,随着时间的推移,还有一面旗帜会越来越优化它。应该注意的是,JIT编译通常不会发生,直到函数执行了大约10,000次,遗憾的是没有办法强制JIT在程序启动时编译代码。据推测,JIT不应该有任何开销,它可能会在后台编译另一个线程的代码,然后在完成时注入本机代码(JIT编译应该只需要不到半秒)。 / p>

至于将结果存储为double,不会对性能产生任何负面影响。此外,您不必为此担心GC,因为它是一种原始类型,它在堆栈中声明并在作用域退出后弹出(变量将在下一次循环迭代中重新声明)。

答案 1 :(得分:0)

你几乎不知道jit是做什么的,但你可以用javap轻松查看字节码。如果javac / ide没有优化它,我不会假设jit会。只需编写好的代码,无论如何都更容易在眼睛上。