gpt4 book ai didi

java - 为什么 HotSpot 会使用提升来优化以下内容?

转载 作者:IT老高 更新时间:2023-10-28 21:00:41 25 4
gpt4 key购买 nike

在《Effective Java》中,作者提到

while (!done) i++;

可以通过HotSpot优化成

if (!done) {
while (true) i++;
}


我对此感到非常困惑。变量done通常不是const,为什么编译器可以这样优化?

最佳答案

作者假设变量 done 是一个局部变量,它在 Java 内存模型中没有任何要求将其值暴露给没有同步原语的其他线程。或者换一种说法:done 的值不会被任何代码更改或查看,除了这里显示的代码。

在这种情况下,由于循环不会改变 done 的值,它的值可以被有效地忽略,编译器可以在循环外提升对该变量的评估,防止它在循环的“热”部分进行评估。这使得循环运行得更快,因为它需要做的工作更少。

这也适用于更复杂的表达式,例如数组的长度:

int[] array = new int[10000];
for (int i = 0; i < array.length; ++i) {
array[i] = Random.nextInt();
}

在这种情况下,简单的实现将评估数组的长度 10,000 次,但由于变量数组从未被分配并且数组的长度永远不会改变,因此评估可以更改为:

int[] array = new int[10000];
for (int i = 0, $l = array.length; i < $l; ++i) {
array[i] = Random.nextInt();
}

其他与提升无关的优化也适用于此。

希望对您有所帮助。

关于java - 为什么 HotSpot 会使用提升来优化以下内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com