2016-08-31 5 views
-6

私は、このクラスのプロセス.IN 6000 recrodsをCalcのランナーのJavaクラスを持って、いくつかの計算は5-6日かかります持っている各レコードがありますJavaプログラムの性能を改善するにはどうすればいいですか?

+4

コードなしではお手伝いできません。 –

+0

私のアプローチ方法それを行う方法 –

+0

jvisualvmのようないくつかのプロファイラを使用し、ほとんどの時間を取る方法を見つける。次に、関連コードを含む質問をしてみてください。 –

答えて

2

事前にマルチスレッドのおかげでコードを改善するために、すべてのrecords.Howを処理しますあなたの問題に対するいくつかの解決策。 その1つは、Fork/Joinフレームワークを使用することです。 ここでは例を挙げて、どのように動作するかを示します。

もちろん、これは単なる例であり、ニーズに合わせてカスタマイズできます。現実には、配列内の値を二重にするためにFork/Joinフレームワークを使用する人はいません。

ints(sourceArray)の配列があり、sourceArrayのすべての値を2倍にして別の配列(targetArray)を埋めたいとします。 compute()メソッドでロジックを含むRecursiveActionを作成できます。 computeメソッドは、バッチサイズが十分に小さい場合は値自体を計算するか、計算を委譲する2つの小さなタスクを作成するかを決めることができます。

import java.util.concurrent.ForkJoinPool; 
import java.util.concurrent.ForkJoinTask; 
import java.util.concurrent.RecursiveAction; 

public class ForkJoinPoolExample { 

    public static final int ARRAY_SIZE = 6000; 
    public static int[] sourceArray = new int[ARRAY_SIZE]; 
    public static int[] targetArray = new int[ARRAY_SIZE]; 

    public void initArray() { 
     for (int i=0; i<ARRAY_SIZE; i++) { 
      sourceArray[i] = i; 
     } 
    } 

    public static class Calc extends RecursiveAction { 
     private int from; 
     private int to; 
     public static final int BATCH_SIZE=5; 

     public Calc(int from, int to) { 
      this.from = from; 
      this.to = to; 
     } 

     @Override 
     protected void compute() { 
      if (to-from <= BATCH_SIZE) { 

       for (int i = from; i<to; i++) { 
        targetArray[i] = sourceArray[i] * 2; 
       } 

      } else { 

       int middle = from +((to - from)/2); 
       invokeAll(new Calc(from, middle), new Calc(middle, to)); 
      } 
     } 

    } 

    public static void main(String[] args) { 
     ForkJoinPoolExample fjpe = new ForkJoinPoolExample(); 
     fjpe.initArray(); 
     ForkJoinPool pool = new ForkJoinPool(); 
     ForkJoinTask task = new Calc(0, ARRAY_SIZE); 
     pool.invoke(task); 
     for (int i=0; i<ARRAY_SIZE; i++) { 
      System.out.println(sourceArray[i] + " -> " + targetArray[i]); 
     } 
    } 

} 
関連する問題