私は、実際には多くの人にとってそれを増やしたことを学んだ後、プロジェクトで並行性を使う予定です。 私はマルチスレッドや並行処理にはあまり取り組んでいませんので、実際のプロジェクトで使用する前に、覚えておいて簡単な概念証明が必要です。同時実行性/マルチスレッディングはいつパフォーマンスを向上させますか?
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の奇数実行後:以下
は、私が試してみました2つの例です。
最初の同時実行性は平均451ミリ秒です。
並行処理のない2番目のものは、平均290ミリ秒かかる。
これは構成、OS、バージョン(Java 7)、プロセッサーによって決まります。 しかし、どちらのアプローチもすべて同じでした。 また、計算量が多いときに並行性のコストが手頃だということも分かっています。しかし、この点は私には分かりませんでした。
これ以上のことを理解するのに役立つことを願っていただければ幸いです。
PS:同様の質問を見つけようとしましたが、この種の問題を見つけることができました。
後期Gene Amdahlは、役に立つと思われる研究を行った。 [Amdahl's law](https://en.wikipedia.org/wiki/Amdahl's_law)も参照してください。 –
ありがとう@ElliottFrisch。私は今それを読むつもりです。 –
'someDumbStuff'のループ持続時間を約1000000に増やしてみてください。予想される傾向が見え始めるかもしれません。 – flakes