2017-02-22 15 views
0

以下の私のコードでは、以前の記事を読んだことがあります。しかし、私のスレッドの理解に基づいて、私は文脈の切り替えのために、より多くのスレッドで時間が全体的に増加することを理解しています。しかし、このコードを実行すると、実行時間が厳しくなります。私はこれを間違って実装していますか?これは私のシステムのためです。あなたが使用するスレッドの実際の数がダウンしたスレッド(args[0])の数を増やす場合はスレッド数が増えると実行時間が短縮されますか?

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class MeanThread { 
    public static void main(String[] args) throws InterruptedException, FileNotFoundException { 
     Scanner s = new Scanner(new File("/Users/Bryan/Desktop/personal/Code/Java/Lab 2/src/input.txt")); 
     ArrayList<Integer> listOfValues = new ArrayList<Integer>(); 
     ArrayList<Double> temporalMeanArray = new ArrayList<Double>(); 
     Double temporalMean = 0.0; 
     while (s.hasNextInt()) { 
      int number = s.nextInt(); 
      listOfValues.add(number); 
     } 
     // define number of threads 
     // this way, you can pass number of threads as 
     // a second command line argument at runtime. 
     int NumOfThread = Integer.parseInt(args[0]); 
     // TODO: partition the array list into N subArrays, where N is the number of threads 
     ArrayList<ArrayList<Integer>> listOfSubArrays = new ArrayList<ArrayList<Integer>>(NumOfThread); 
     for (int i = 0; i < listOfValues.size(); i += NumOfThread) { 
      listOfSubArrays.add(new ArrayList<Integer>(listOfValues.subList(i, Math.min(i + NumOfThread, listOfValues.size())))); 
     } 
     // TODO: start recording time 
     //Tip: you can't create big number of threads in the above way. So, create an array list of threads. 
     ArrayList<MeanMultiThread> threadList = new ArrayList<MeanMultiThread>(); 
     for (int i = 0; i < listOfSubArrays.size(); i ++) { 
      threadList.add(new MeanMultiThread(listOfSubArrays.get(i))); 
     } 
     // TODO: start each thread to execute your computeMean() function defined under the run() method 
      //so that the N mean values can be computed. for example, 
     int threadCounter = 1; 
     long startTime = System.currentTimeMillis(); 
     for (MeanMultiThread mmt : threadList) { 
      mmt.start(); 
     } 

     for (MeanMultiThread mmt : threadList) { 
      mmt.join(); 
      System.out.println("Temporal mean value of thread " + threadCounter + " is " + mmt.getMean()); 
      threadCounter ++; 
      temporalMeanArray.add(mmt.getMean()); 
     } 

     for (Double d : temporalMeanArray) { 
      temporalMean += d; 
     } 
     Double globalMean = temporalMean/temporalMeanArray.size(); 
     long endTime = System.currentTimeMillis(); 
     long elapsedTime = endTime - startTime; 
     System.out.println("Total elapsed time is " + elapsedTime + " milliseconds."); 
     System.out.println("The global mean value is " + globalMean); 

    } 
} 
//Extend the Thread class 
class MeanMultiThread extends Thread { 
    private ArrayList<Integer> list; 
    private double mean; 
    int counter = 0; 
    MeanMultiThread(ArrayList<Integer> array) { 
     list = array; 
    } 
    public double getMean() { 
     return mean; 
    } 
    public void run() { 
     mean = computeMean(list); 

    } 
    private double computeMean(ArrayList<Integer> list2) { 
     double totalAmount = 0.0; 
     for (int i : list2) { 
      totalAmount += i; 
     } 
     return totalAmount/(list2.size()); 
    } 
} 
+0

複数のコアを持つマシンでは、実行時間が長くなり、長時間実行されるタスクではスレッドの適度な量が減少します。 – Zyga

+0

私は4つのコアを持つ友人のコンピュータでそれをテストし、実行時間は1スレッドと比較して2048スレッドで増加しました。私はここに何かを得ていないのですか? – bryancresswell

+0

このようなスレッドの量が多いと、コンテキストの切り替えがパフォーマンスに影響します。 – Zyga

答えて

2

(私はMacBook Proの2015を使用しています)。その理由は、サブアレイのバケットサイズとしてNumOfThreadを使用しているためです。バケツサイズを大きくすると、バケツが少なくなり、スレッド数が少なくなります。問題のある行は関係なく、スレッド数のバケットサイズを一定に保ち、その後、あなたは意味のある結果を得ることができます

for (int i = 0; i < listOfSubArrays.size(); i ++) { 

とともに

for (int i = 0; i < listOfValues.size(); i += NumOfThread) { 

です。ワークロードが完全にCPUバウンドであるため、CPUが同時に処理できるスレッドよりも多くのスレッドを持つとすぐに意味のあるスピードアップは得られません。

+0

意味のある結果が得られたら、どういう意味ですか?スピードはスレッドの数が増えるほど遅くなるでしょうか? – bryancresswell

+1

入力が100行あるとします。スレッド数を1に設定すると、バケットサイズが1(入力数をスレッド数で割った値)なので、100スレッドが得られます。スレッド数を25に設定すると、4つのスレッドが得られます。あなたは同時に2つのことを変えています:仕事の量と労働者の量。私はあなたが可変数の労働者で一定量の仕事をしたいと思う。 – aha

+0

これは多くの意味がありました。ありがとう! – bryancresswell

関連する問題