向方法添加局部变量会使它们变慢吗?

时间:2011-04-23 04:06:25

标签: java performance micro-optimization

这个问题共收到几段答案。这是唯一能够告诉我我在找什么的句子:

  

由于中间计算需要临时存储在堆栈中,以便以后可以使用,因此您的示例几乎没有什么区别。

事实上,它完美而完整地回答了我的问题=)

与所有告诉我“不要问这个问题”的人不同。 > _<


就像你有一个方法,并且你通过增加局部变量的数量来改变它但不做其他改变,是否会使方法变慢?这是一个例子:

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开始研究它会怎么样?

这个问题与我正在处理的代码生成器有关。

5 个答案:

答案 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)

这不是热点问题。可能需要额外的字节代码来加载和存储局部变量,但让编译器担心优化它。

您应该专注于生成的代码中的空指针检查等问题,以及如何以与您生成代码的源输入相关的有意义的方式报告错误。