2016-03-24 4 views
0

私は、実際には多くの人にとってそれを増やしたことを学んだ後、プロジェクトで並行性を使う予定です。 私はマルチスレッドや並行処理にはあまり取り組んでいませんので、実際のプロジェクトで使用する前に、覚えておいて簡単な概念証明が必要です。同時実行性/マルチスレッディングはいつパフォーマンスを向上させますか?

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:同様の質問を見つけようとしましたが、この種の問題を見つけることができました。

+0

後期Gene Amdahlは、役に立つと思われる研究を行った。 [Amdahl's law](https://en.wikipedia.org/wiki/Amdahl's_law)も参照してください。 –

+0

ありがとう@ElliottFrisch。私は今それを読むつもりです。 –

+0

'someDumbStuff'のループ持続時間を約1000000に増やしてみてください。予想される傾向が見え始めるかもしれません。 – flakes

答えて

1

同時実行性には、1)パフォーマンスと2)コードの単純さ(Webリクエストの1000リスナーなど)の少なくとも2つの目的があります。

パフォーマンスが目的の場合、動作させるハードウェアコアの数よりもスピードアップを得ることはできません。 (スレッドがCPUバインドの場合のみです) さらに、各スレッドには大きな起動オーバーヘッドがあります。 4コアマシンで1000スレッドを起動すると、4倍のスピードアップよりも優れた処理はできませんが、それに対して1000スレッドの起動コストがかかります。

+0

私の目的はパフォーマンスです。スレッドがCPUにバインドされているかどうかは不明です。これは、限られたコアマシンの並行性が助けにならないことを意味しますか?なぜなら、_newFixedThreadPool_でスレッド数を増やすと時間が減少するからです。しかし、あなたの答えは依然として役立ちます。 –

+0

I/O、スリープ、ロックを行っていないか、メモリワーキングセットが物理メモリと比較して大きければ、スラッシングが発生しない限り、CPUバインドされます。あなたは正しいです - 利用可能なコアの数より多くの並行性を持つべきではありません。コアより多くのスレッドがある場合、それらは利用可能なハードウェアのためにお互いに戦ってしまいます。並行処理で時間を節約したい場合は、より多くのコアを取得する必要があります。 –

1

concurrecyスレッドが同じデータソースに を共有している際に必要とされているいくつかのスレッドがこのソースで作業しているとき、それは仕事を終える まで、彼らはアクセスも を持っているよりもとても他の人が待機しなければならないので、あなたが同期Methodeのを学ぶ必要があるとbluckまたは私の英語のために残念こと ようないくつかのものは、それが論理的にそうそこに併存しているいくつかの問題がある答えの1で述べたように、同時実行の一つの使用は、すなわち、コードのシンプルさを持つことである有用 https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

1

だturialこれを読んで生産者 - 消費者の問題のような非同期的な方法でそれらの問題をモデル化する方法はない

それ以外の場合、並行プログラムは、保存できる場合にのみパフォーマンスに追加されますCPUサイクルあなたの目標はCPUまたはCPUを常にビジー状態に保ち、そのサイクルを無駄にしないことです。さらに、あなたのプログラムがディスクI/O、ロック待ち、スリープ、GUIアプリケーションユーザー待ちなどの待機のような非CPUタスクでビジー状態になっているときに、CPUが何か役に立つと思うことを意味します。プログラムの実行時間の合計。

したがって、ご質問は、あなたのプログラムは、あなたのプログラムがそれを使用していないとき何をしていますか?その時間に私のプログラムの一部を完了し、別のスレッドで待機部分を分けることはできますか?今では、最新のシステムのほとんどは、マルチプロセッサとマルチコアシステムであり、プログラムが並行していないと無駄につながります。

あなたが書いた例は、メモリのすべての処理を待ち状態にすることなく、スレッドの設定やコンテキスト切り替えの損失だけが増えないようにすることです。

DBを使用してパフォーマンスを測定し、100万レコードを取得し、それらのレコードを処理し、それらのレコードを再度DBに保存してみます。 DB操作はディスクを集中的に使用するため、DBに読み書きするときには実際にディスクI/Oを実行しており、CPUはその間にそのサイクルを無駄にしているので、パフォーマンスの違いに気付くように、順次で小さなバッチで実行しますその時。私の意見で

、同時実行のための良い候補者はそうでないあなたも、同時実行のための良好な候補である一部バックグラウンドタスクを必要とする多くのgain.Programsが表示されない上記の待機操作の1つを含む長時間実行されるタスクです。

同時実行性をCPUのマルチタスクと混同しないでください。つまり、同じCPU上で同時に異なるプログラムを実行する場合です。

希望すると助かります!

+0

本当に助けになりました。 –

関連する問題