【问题标题】:Does using braces inside a Java method reduce performance?在 Java 方法中使用大括号会降低性能吗?
【发布时间】:2013-07-09 21:56:02
【问题描述】:

好像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 } }

【问题讨论】:

  • 在语法上影响性能的不是大括号,而是它的含义。在这种情况下,这意味着创建一个新类并实例化它。在这种情况下,它没有任何意义,它将作为死代码被删除。

标签: java performance block


【解决方案1】:

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

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

这个额外的类有开销。

【讨论】:

  • 谢谢!您能指出语法中定义双括号初始化的位置吗?
  • @sdasdadas: ClassCreatorRest: Arguments [ClassBody]
  • 不是,真的;双括号初始化技术只是普通匿名类中的普通初始化块。
  • @LouisWasserman 我找到了常规类声明,但找不到内部类声明。 :)
  • @SLaks 这不是在回答 OP 的问题,是吗?我认为这是关于块语句,而不是关于内联初始化块......
【解决方案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);
}

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多