2016-02-15 10 views
8

私はラッパーのコストが非常に高価なものとして表示されるスレッドエグゼキュータの実装をしています。ここでJavaメソッドの呼び出しにはコストがかかるのはなぜですか?

class Task { 
    public Runnable r;  
    public Task(Runnable r) {   
    this.r = r;                 
    } 

    public void run() {  
    r.run();  
    }  

List<task> taskList; 

以下の場合、実行時間は〜800msです。次のように定義されているラッパークラスTaskがあります。

for (Task t : taskList) {             
      t.r.run();     
    } 

以下のケースでは〜7000msですが、

for (Task t : taskList) {   
      t.run();                
} 

孤立して起こるのではなく、実行プログラムのコード内で起きています。誰かが何が起こっているかもしれないかについてのヒントがあるのか​​どうか疑問に思うだけですか?

ランナブルが渡され、このテストケースについては、以下である:参考

class Tester implements Runnable {             
    int i;                   

    public Tester(int i) {               
    this.i = i;                  
    }                     

    @Override                   
    public void run() {                
    //System.out.println(i);              
    for (int j = 0; j < 1000000; j++) {            
     i = j;                  
    }                    
    }                     

    public int getI() {                
    return i;                  
    } 

、コードがgithub.com/sharvanath/TempThreadPoolに見出すことができます。実行結果を取得するためにThreadPoolTestを実行します。 ThreadPool.javaの41行目を変更して、その魔法を見てみましょう。

+0

「実行する」とは何ですか?それはノーオペレーションですか? – 5gon12eder

+1

ここに投稿したコードには(ほとんどゼロ)違いがあります。他のコードには何かがあるはずです。 –

+5

コード全体を共有するべきではありません。問題を示す*最小限の例を含める必要があります。 –

答えて

1

jvmはJITコンパイラを使用してコードを最適化し、あなたが知らない多くのトリックを行うことができるため、実際にテストのように見えるので、いくつかのトリックを使用する必要があることを考慮してくださいJVMがあなたのためにこの仕事をするのに必要なすべてのことをするわけではありません(テストの前にウォームアップしなければならない、ライニングやデッドコードなどで脱出する必要があります)。

このトピック - How do I write a correct micro-benchmark in Java?

また、この種のテストにはJMHフレームワークを使用することをお勧めします。このサンプルにはすでにソースコードの使用例がたくさんあります。

+0

Ifあなたはリンクを提供します。リンクが破損する可能性があるので、関連する部分をコピーしてください。 –

関連する問題