这个问题共收到几段答案。这是唯一能够告诉我我在找什么的句子:
由于中间计算需要临时存储在堆栈中,以便以后可以使用,因此您的示例几乎没有什么区别。
事实上,它完美而完整地回答了我的问题=)
与所有告诉我“不要问这个问题”的人不同。 > _<
就像你有一个方法,并且你通过增加局部变量的数量来改变它但不做其他改变,是否会使方法变慢?这是一个例子:
void makeWindow() {
Display
.getContext()
.windowBuilder()
.setSize(800, 600)
.setBalloonAnimal(BalloonAnimal.ELDER_GOD.withColor(PUCE))
.build();
}
或
void makeWindow() {
DisplayContext dc = Display.getContext();
WindowBuilder wb = db.windowBuilder();
BalloonAnimal god = BalloonAnimal.ELDER_GOD;
BalloonAnimal puceGod = god.withColor(PUCE);
wb.setSize(800, 600).setBalloonAnimal(puceGod).build();
}
另一个例子:
int beAnExample(int quiche) {
return areGlobalsEvil?
quiche * TAU/5:
highway(quiche, Globals.frenchFrenchRevolution);
}
或
int beAnExample(int quiche) {
if (areGlobalsEvil) {
int to5 = TAU/5;
int result = quiche * to5;
return result;
} else {
Game french = Globals.frenchFrenchRevolution;
int result = highway(quiche, french);
return result;
}
}
真的,我要问的是:这种局部变量的数量是否与方法编译为字节码时相关?如果是这样,一旦Hotspot开始研究它会怎么样?
这个问题与我正在处理的代码生成器有关。
答案 0 :(得分:5)
简单的答案是否定的。局部变量消耗运行时堆栈空间。为它们分配空间只会略微增加指令的数量。您的示例几乎没有什么区别,因为中间计算需要临时存储在堆栈上,以便以后可以使用它们。更多地关注程序的可读性而不是不必要的微优化。
如果您对查看课程的实际字节码感兴趣,请调查javap
计划。
答案 1 :(得分:1)
不要担心。编译器可以做各种疯狂的,make-your-head-asplode优化。从正确且可维护的代码开始。程序员时间远远超过处理器时间。
答案 2 :(得分:1)
通过运行每种方法1,000,000次来测试它,并将总时间除以计算每次执行的成本。很有可能,它不会是显而易见的。
实际上,Java编译器甚至可能足够聪明,可以将其编译出来。
编写代码以提高可读性,以降低长期维护成本。然后在你真正需要的5%的地方调整它。
答案 3 :(得分:0)
很可能它会产生很小的(如果有的话)差异,而“小”则是微不足道的。
专注于使你的生成器正确和可维护,让Java编译器(特别是JIT编译器)对生成的代码进行微优化。
请注意,@ Edawg关于查看字节码的建议并不一定有用。 JIT编译器积极地优化它从字节码生成的本机代码。可能难以预测两个字节码序列中的哪一个会更快。当然,计算字节码,方法调用等可能会产生误导。
确保生成“最佳”Java源代码的唯一方法是编译它并在目标平台上进行基准测试。即便如此,通过JIT编译器更改,您的源代码级优化工作也很有可能被取消。
答案 4 :(得分:-1)
这不是热点问题。可能需要额外的字节代码来加载和存储局部变量,但让编译器担心优化它。
您应该专注于生成的代码中的空指针检查等问题,以及如何以与您生成代码的源输入相关的有意义的方式报告错误。