【发布时间】:2013-12-16 21:12:20
【问题描述】:
假设我有这门课
Util
{
public static void doSomething()
{
if (FLAG) foo();
else bar();
}
public static void foo() { /* do something */ }
public static void bar() { /* do something else */ }
public static final boolean FLAG = computeFlag();
private static boolean computeFlag() { /* do some computation during init time*/ }
}
FLAG 显然永远不会改变。
并假设Util.doSomething() 被使用很多(在许多关键的地方,性能确实很重要)。
Java 编译器或 JVM 是否足够聪明地缓存 doSomething 的主体,这样代码就不必重新评估 FLAG 或重新执行分支指令?
如何检查?
谢谢
【问题讨论】:
-
编译器,没有。也许是 JVM。
-
如果一个新的 CPU 的分支预测器的值永远不会改变,那么它的分支预测器将会撕裂它。
-
哎呀,对不起,我不是指编译器。我的意思是 JVM,是的。
-
我确实改变了它。 (也可能是编译器,如果某个编译器足够聪明,可以静态评估
computeFlag的主体并看到该值在编译时已知,因此FLAG的值在编译时也是已知的时间...:D) -
它在运行时是最终的,而不是编译时。如果 computeFlag 理论上可能会受到运行时确定的任何东西的影响,则编译器无法在编译时确定该值。如果没有,你应该弄清楚并直接分配它。
标签: java compiler-construction compiler-optimization