2017-04-26 55 views
0

我写这样的事情:在法的内部类VS一流水平的内部类

class Root { 
    public void action() { 
     List<Foo> param1; 
     List<Foo> param2; 

     class Node implements Runnable { 
      public void run() { 
       // read param1, some stuff, insert in param2 
      } 
     } 

     tpe ThreadPoolExecutor = new ThreadPoolExecutor(..); 

     // And submit some work, a few times 
     tpe.submit(new Node()); 
     tpe.submit(new Node()); 

     // some stuff with param1 & 2 
    } 
} 

然后,我想知道是不存在的性能问题与此有关。如果我在方法中声明内部类并使用局部变量不会影响性能,那么JIT编译器可能永远无法优化内部类的执行,因为它周围的上下文。 所以我写了这样的事情,它做同样的事情:

class Root { 
    class Node implements Runnable { 

     List<Foo> param1; 
     List<Foo> param2; 

     public Node(List<Foo> param1, List<Foo> param2) { 
      this.param1 = param1; 
      this.param2 = param2; 
     } 

     public void run() { 
      // read param1, some stuff, insert in param2 
     } 
    } 

    public void action() { 
     List<Foo> param1; 
     List<Foo> param2; 

     tpe ThreadPoolExecutor = new ThreadPoolExecutor(..); 

     // And submit some work, a few times 
     tpe.submit(new Node(param1, param2)); 
     tpe.submit(new Node(param1, param2)); 
    } 
} 

应用程序是在重负载下,所以我想知道,从性能上来说做到这一点的最好办法。任何人都可以提供见解吗?

+0

我不明白为什么应该有所不同。 – shmosel

+0

在第二个例子中'param1'和'param2'是'Node'的字段吗?他们没有宣布。第一个例子也不明显。 ''param1/2'只有当它们是'action()'中通过闭包捕获的'Root'字段时才能被访问。然而,这将需要一个匿名的Node类,它们是最终的。 – Matthias247

+0

是的,他们是节点的字段。我在我的帖子中解决了这个问题。在第一个例子中,params实际上是最终的,并且上下文被捕获以保存线程的变量。这是什么让我质疑它的性能。为什么我需要创建一个匿名节点类? – JesusTheHun

回答

0

类声明发生在编译时,而不是在运行时。没有运行时间性能差异。