Я планировал использовать параллелизм в проекте, узнав, что он действительно увеличился через множество для многих. Теперь я не много работал над многопоточными или параллельными процессами, поэтому решил изучить и иметь простое доказательство концепции, прежде чем использовать его в реальном проекте.
Ниже приведены два примера, я пытался:Когда параллелизм/многопоточность помогают повысить производительность?
1. With use of concurrency
public static void main(String[] args)
{
System.out.println("start main ");
ExecutorService es = Executors.newFixedThreadPool(3);
long startTime = new Date().getTime();
Collection<SomeComputation> collection = new ArrayList<SomeComputation>();
for(int i=0; i< 10000; i++){
collection.add(new SomeComputation("SomeComputation"+i));
}
try {
List<Future<Boolean>> list = es.invokeAll(collection);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("\n end main "+(new Date().getTime() - startTime));
}
2. Without use of concurrency
public static void main(String[] args) {
System.out.println("start main ");
long startTime = new Date().getTime();
Collection<SomeComputation> collection = new ArrayList<SomeComputation>();
for(int i=0; i< 10000; i++){
collection.add(new SomeComputation("SomeComputation"+i));
}
for(SomeComputation sc:collection)
{
sc.compute();
}
System.out.println("\n end main "+(new Date().getTime() - startTime));
}
Both share a common class
class SomeComputation implements Callable<Boolean>
{
String name;
SomeComputation(String name){this.name=name;}
public Boolean compute()
{
someDumbStuff();
return true;
}
public Boolean call()
{
someDumbStuff();
return true;
}
private void someDumbStuff()
{
for (int i = 0;i<50000;i++)
{
Integer.compare(i,i+1);
}
System.out.print("\n done with "+this.name);
}
}
Теперь анализ после 20 нечетных пробегов каждого подхода.
Первый с параллелизмом занимает в среднем 451 мсек.
Второй без параллелизма занимает в среднем 290 мс.
Теперь я узнал, что это зависит от конфигурации, ОС, версии (java 7) и процессора. Но все было одинаково для обоих подходов. Также узнал, что стоимость параллелизма является доступной, когда вычисление тяжелое. Но этот момент мне не был понятен.
Надеюсь, что кто-то может помочь мне понять это больше.
PS: Я пробовал найти похожие вопросы, но мог бы найти этот вид. Пожалуйста, прокомментируйте ссылку, если вы это сделаете.
Покойный Джин Амдал провел некоторые исследования, которые могут вам помочь; см. также [закон Амдаля] (https://en.wikipedia.org/wiki/Amdahl's_law). –
Спасибо @ElliottFrisch. Я собираюсь прочитать его прямо сейчас. –
Попробуйте увеличить продолжительность цикла в 'someDumbStuff' примерно до 1000000, и вы можете начать видеть более ожидаемый тренд. – flakes