У меня есть класс javascript Calc Runner. В этом классе процесс 6000 recrods, каждая запись имеет некоторый расчет, занимает 5-6 дней для обработки всех записей. Как улучшить код с несколькими потоками. Заранее спасибоКак улучшить производительность Java-программы?
-6
A
ответ
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]);
}
}
}
Без кода мы не можем вам помочь. –
меня подход, как это сделать. –
Используйте некоторый профилировщик как jvisualvm и узнайте методы, которые занимают большую часть времени. Затем попробуйте задать вопрос, включая соответствующий код. –