在Java方法中使用大括号会降低性能吗?

时间:2013-07-09 21:56:02

标签: java performance block

好像double-brace initialization increases overhead

在方法中使用大括号是否也会降低性能?

例如

public class DoIReducePerformanceToo {

    public void aMethod() {

        {
           // Is it a bad idea to use these?
        }

    }

}

我看过Java的grammar,看起来它被归类为块:

Block: 
    { BlockStatements }

BlockStatements: 
    { BlockStatement }

BlockStatement:
    LocalVariableDeclarationStatement
    ClassOrInterfaceDeclaration
    [Identifier :] Statement

但是我不确定语法双括号初始化的位置在哪里。

我的问题:在方法中使用块语句会降低Java的性能吗?这些块与双支撑初始化具有相同的性质吗?

编辑:

内部课堂即时:是

ClassCreatorRest: Arguments [ClassBody]

ClassBody: 
    { { ClassBodyDeclaration } }

3 个答案:

答案 0 :(得分:6)

双括号初始化技巧 nothing 与正常范围有关。

相反,它创建了一个继承初始化类型的匿名类,并在初始化块中运行代码(这是构造函数的语法糖)。

这个额外的课程有开销。

答案 1 :(得分:2)

块语法是语法的一部分,但也会改变诸如变量范围之类的内容。但是,在编译之后,变量,语法,范围和所有内容都只是转换为普通的字节码格式。字节码不关心作用域规则等,因此在代码中使用额外的块应该无开销

例如,代码

void something()
{
    int x = 5;
    randomStuffWithInt(x);
    {
        int x = 10;
        somethingWithInt(x);
    }
}

可以转换(alpha转换)为

void something()
{
    int x = 5;
    randomStuffWithInt(x);
    int y = 10;
    somethingWithInt(y);
}

在运行时,速度应完全相同。

答案 2 :(得分:1)

迟到的回答,但是......我认为实际上会有执行影响(虽然不一定是大的),因为运行时引擎会在堆栈上创建一个局部变量符号表来容纳块内的变量。如果这是在循环上下文中或在需要高速的代码中完成的,则建议避免使用它。