2017-04-26 6 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

2番目の例では 'param1'と' param2'は 'Node'のフィールドですか?彼らは宣言されていません。最初の例も明らかではありません。 'param1/2'は、' action() 'の内側からクロージャーでキャプチャされたときの' Root'のフィールドである場合にのみアクセスできます。しかし、これには匿名のNodeクラスが必要であり、それらは最終的なものです。 – Matthias247

+0

はいノードのフィールドです。私は私のポストでそれを修正しました。最初の例では、実際にはparamsはfinalで、スレッドの変数を保存するためにコンテキストが取り込まれます。これが私にそれのパフォーマンスを疑わせるものです。なぜ私は匿名ノードクラスを作る必要がありますか? – JesusTheHun

答えて

0

クラス宣言は、実行時ではなくコンパイル時に行われます。実行時のパフォーマンスの違いはありません。

関連する問題