我目前正在编写的代码将有成千上万次迭代,并想知道现代Java编译器在优化时是否会自动处理中间值转换为汇编语言。例如,在循环中我有以下代码(简化):
arrayA[i] += doubleA*doubleB;
arrayB[i] += doubleA*doubleB;
现代Java编译器是否足够“智能”,可以将doubleA*doubleB存储到乘法寄存器中(然后在第二个数组中继续从乘法寄存器中读取,避免第二次浮点运算)?还是说我最好采用以下方法:
double product = doubleA*doubleB;
arrayA[i] += product;
arrayB[i] += product;
对于第二个选项,我主要关注的是Java的垃圾收集器每次处理产品变量时的开销。
vaddpd
执行四个打包的double
加法,以尽可能快地完成CPU的工作。 - Peter Cordesdouble
是一种原始类型,根本不是一个Object
,对吧?所以JVM不可能把它放在堆上。 - Peter CordesdoubleA*doubleB
只被计算一次。如果你不信任编译器(或者只是觉得它看起来更好),那就采用第二种方式写,因为不会有任何垃圾回收开销。 - Kevin Anderson