1

似乎双括号初始化增加了开销

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

例如。

public class DoIReducePerformanceToo {

    public void aMethod() {

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

    }

}

我看了一下Java的语法,似乎这被归类为一个块:

Block: 
    { BlockStatements }

BlockStatements: 
    { BlockStatement }

BlockStatement:
    LocalVariableDeclarationStatement
    ClassOrInterfaceDeclaration
    [Identifier :] Statement

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

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

编辑:

内部类实例化是:

ClassCreatorRest: Arguments [ClassBody]

ClassBody: 
    { { ClassBodyDeclaration } }
4

3 回答 3

6

双括号初始化技巧与普通作用域无关。

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

这个额外的类有开销。

于 2013-07-09T21:57:33.217 回答
2

块语法是语法的一部分,但也会改变变量范围等内容。然而,在编译之后,变量、语法、作用域等等都只是转换成纯字节码格式。字节码不关心范围规则等,因此在代码中使用额外的块应该没有开销。

例如,代码

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

可以转换(阿尔法转换)为

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

在运行时,它应该是完全相同的速度。

于 2013-07-09T21:59:49.987 回答
1

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

于 2015-12-21T19:05:52.727 回答