2016-08-31 7 views
-6

У меня есть класс javascript Calc Runner. В этом классе процесс 6000 recrods, каждая запись имеет некоторый расчет, занимает 5-6 дней для обработки всех записей. Как улучшить код с несколькими потоками. Заранее спасибоКак улучшить производительность Java-программы?

+4

Без кода мы не можем вам помочь. –

+0

меня подход, как это сделать. –

+0

Используйте некоторый профилировщик как jvisualvm и узнайте методы, которые занимают большую часть времени. Затем попробуйте задать вопрос, включая соответствующий код. –

ответ

2

Есть несколько решений вашей проблемы. Одним из них является использование структуры Fork/Join. Вот пример, просто чтобы показать вам, как это работает.

Конечно, это просто пример, который вы можете настроить в соответствии с вашими потребностями; в реальной жизни никто не будет использовать структуру Fork/Join, чтобы удваивать значения в массиве.

Скажем, у вас есть массив ints (sourceArray), и вы хотите заполнить еще один массив (targetArray) всеми значениями sourceArray в два раза. Вы можете создать RecursiveAction, который содержит вашу логику в методе compute(). Метод вычисления может решить вычислить сами значения, если размер партии достаточно мал или может создать две другие более мелкие задачи, которым делегировать вычисление.

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]); 
     } 
    } 

}