1

У меня есть кусок кода Java, который создает объект из xml и занимает несколько наносекунд до миллисекунды в зависимости от размера объекта. Иногда я должен вызвать этот метод 1-2 раза, иногда 70-80 раз в цикле, чтобы построить список объектов.Когда выполнение параллельных операций является излишним?

Я пробовал строить объекты параллельно, но иногда это занимает вдвое больше, чем последовательное и половину других времен. Теперь мой вопрос в том, есть ли какие-либо рекомендации или показатели эффективности производительности, чтобы руководствоваться, когда следует использовать многозадачность и когда это просто избыток?

Пример кода, который я использую:

List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>(); 
    for (final Integer object : list) { 
     Callable<Integer> c = new Callable<Integer>() { 
      @Override 
      public Integer call() throws Exception { 
        return test.m1(object); 
      } 
     }; 
     tasks.add(c); 
    } 
    List<Future<Integer>> results = EXEC.invokeAll(tasks); 

    for (Future<Integer> fr : results) { 
     fr.get(); 
    } 
+0

Как определяется 'EXEC'? –

+0

Какая работа 'test.m1()' делает? – vsnyc

+0

ExecutorService EXEC = Executors.newCachedThreadPool(); – Heisenberg

ответ

1

Посмотрите на сообщение Дуга Лиа "When to use parallel streams".

Грубая оценка (в десятикратном размере) равна 100 микросекунд последовательного исполнения, когда начинается параллельное вычисление. Хотя есть много факторов, которые следует учитывать.

+0

Это больше похоже на это. Я посмотрю. Благодаря :) – Heisenberg

1

Короткий ответ: Это перебор, когда у вас нет проблем с производительностью или IO блокировки.

Пара факторов о параллельном выполнении являются:

  • Насколько связь/необходима координация между задачами. См. Embarrassingly parallel для примеров с минимальной координацией.
  • Структуры для параллельной обработки требуют времени. например, OSX Thread takes about 90 microseconds, поэтому вам нужно сэкономить, по крайней мере, столько (если вы его создадите).
  • Параллельная обработка не ускорит последовательную фракцию. Если задача занимает час, и только 75% ее могут обрабатываться параллельно, вы не завершите ее менее чем за 15 минут. См. Amdahl's law.
+0

Мои задачи не требуют никакой координации между ними. Закон Амдаля помогает. Но я надеялся получить некоторые приблизительные показатели производительности или графики, проверенные кем-то на их машине. Если возможно, в Java. Скажите на linux, если для метода требуется 500 микросекунд, и мне нужно выполнить его 100 раз в цикле, тогда имеет смысл выполнять их параллельно с использованием fixedThreadPool. – Heisenberg

+0

@ Mr.White Если у вас проблемы с производительностью, сначала профайл приложения, чтобы выработать узкое место. – mikek3332002

Смежные вопросы