2017-05-10 7 views
1

threadsの数が増えたり、並列処理が進むと時間が短縮されますが、ここではデフォルトのハッシュコードを計算するのに2倍の時間を要するObject.hashCodeの速度が低下しています4つのスレッドと1つのスレッドを同じ数のオブジェクトに対して実行しています。マルチスレッドはプログラムの速度を遅くします

これと並行して同様の時間がかかります。

しかし、以下のコードを実行したとき。各スレッドには同じ作業量があるので、4つのスレッドを実行すると1つのスレッドを実行するのとほぼ同じ時間がかかることがあります。

4スレッドの場合は2.3秒、1スレッドの場合は9秒です。

public class Test { 

    private static final int THREAD_COUNT = 1; 
    private static final int ITERATIONS = 20000000; 

    public static void main(final String[] args) throws Exception { 
     long start = System.currentTimeMillis(); 
     new Test().run(); 
     System.err.println(System.currentTimeMillis() - start); 
    } 

    private final ExecutorService service = Executors.newFixedThreadPool(THREAD_COUNT, new ThreadFactory() { 
     private final ThreadFactory factory = Executors.defaultThreadFactory(); 

     @Override 
     public Thread newThread(final Runnable r) { 
      Thread thread = factory.newThread(r); 
      thread.setDaemon(true); 
      return thread; 
     } 
    }); 

    private void run() throws Exception { 
     Callable<Void> work = new java.util.concurrent.Callable<Void>() { 
      @Override 
      public Void call() throws Exception { 
       for (int i = 0; i < ITERATIONS; i++) { 
        Object object = new Object(); 
        object.hashCode(); 
       } 
       return null; 
      } 
     }; 
     @SuppressWarnings("unchecked") 
     Callable<Void>[] allWork = new Callable[THREAD_COUNT]; 
     Arrays.fill(allWork, work); 
     List<Future<Void>> futures = service.invokeAll(Arrays.asList(allWork)); 
     for (Future<Void> future : futures) { 
      future.get(); 
     } 
    } 

} 

注:私はこの記事C# Multithreadingを読んでいますが、C#であるように私はそれを把握することができる午前、いくつかのいずれかが、私は"new Object()"を取る場合、私はJVMの観点

+0

スレッドは本当に 'hashCode()'の結果を破棄しているので、実際には何もしません。だから私が間違っていない限り、JITコンパイラは 'call()'の中でループ全体をスキップするかもしれません。 'call()'メソッドは現在、常に 'null'を返すので、無用に思えます。 –

+0

レコードについて:あなたはこれを読んでいます:http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – GhostCat

+0

コードを見た後、 1つのスレッドがW量の作業(操作)を行う場合、N個のスレッドがN * W操作を実行することを考慮に入れる必要があります。パラレルシップが実行時間を短縮するケースはそうではありません。このコードではマルチスレッドは必要ありません。 – Eugene

答えて

1

から同じことを理解するのに役立ちますループの中から相対的なマルチスレッドのパフォーマンスが大幅に向上しました。

と表示されます。"new Object()"はGC干渉を除去します。

この場合、デフォルトのハッシュコードを含む:原子compare-and-swap操作を介しobjectヘッダにこれをインストールhashcode

  • タイトの原子CASの使用を算出

    1. ループは機能コードのコア部分を効果的にシリアライズし、その結果、比較的大きな部分が連続して実行されます。

    +0

    Googleで回答を探しているうちにちょうど見つけた... :) –

    +0

    @ GhostCat-いいえ、私は今私の答えを得て、すべてのことをはっきりと理解する –

    関連する問題