2011-01-19 5 views
3

私は、プロセッサにコアを追加することが計算速度にどのように影響を与えるかについて、science fairプロジェクトを行っています。 EclipseプラットフォームでJavaでこれを行うための独自のベンチマークをプログラミングしました。私の問題は、プログラムが実行されているときに、1つの処理コアのみを使用しているときと、すべて6を使用しているときにどれくらい時間がかかっているのかにはほとんど違いがないということです。プログラムを取得できる方法はありますか追加の処理コアを使用して、6つのコアでより高速に動作するようにしますか?コードのコピーは次のとおりです。Eclipseで複数の処理コアを使用するJavaプログラムを取得するにはどうすればよいですか?

import java.util.Calendar; 
import java.text.SimpleDateFormat; 
import java.util.Scanner; 
import java.text.*; 
public class SciFair 
{ 
/** 
    * N. Roberts 
    * 1/13/11 
    * Science Fair 2011 
    */ 
public static String now(String dateFormat) { 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    return sdf.format(cal.getTime()); 

} 

    public static void main(String[] args) 
    { 

     Scanner dataIn = new Scanner(System.in); 
     DecimalFormat timeInSeconds = new DecimalFormat("##.###"); 

     System.out.println("Are you ready to begin the benchmark? "); 
     String response = dataIn.nextLine(); 
     double num = 5832544225416546445465465465465465448412168546725.2655236355335649499923164684654345649874181221173246189579162421579584572121334216957951462175918894199993642446445548521652158975; 
     double endNum = 0; 

     if(response.equals("Yes") || response.equals("yes") || response.equals("Ok") || response.equals("ok")) 
     { 

     System.out.println("Benchmark starting at " + SciFair.now("H:mm:ss:SSS") + "."); 

     String startTimeHours = SciFair.now("H"); 
     String startTimeMinutes = SciFair.now("mm"); 
     String startTimeSeconds = SciFair.now("ss"); 
     String startTimeMilliseconds = SciFair.now("SSS"); 
     double startTimeHoursNumFormat = Double.valueOf(startTimeHours.trim()).doubleValue(); 
     double startTimeMinutesNumFormat = Double.valueOf(startTimeMinutes.trim()).doubleValue(); 
     double startTimeSecondsNumFormat = Double.valueOf(startTimeSeconds.trim()).doubleValue(); 
     double startTimeMillisecondsNumFormat = Double.valueOf(startTimeMilliseconds.trim()).doubleValue(); 
     double startHoursInSeconds = (startTimeHoursNumFormat * 3600); 
     double startMinutesInSeconds = (startTimeMinutesNumFormat * 60); 
     double startMillisecondsInSeconds = (startTimeMillisecondsNumFormat/1000); 
     double startTotalSeconds = (startHoursInSeconds + startMinutesInSeconds + startTimeSecondsNumFormat + startMillisecondsInSeconds); 

      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("\nBenchmark is 10% complete."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 20% complete.."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 30% complete..."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 40% complete...."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 50% complete....."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 60% complete......"); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 70% complete......."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 80% complete........"); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 
      System.out.println("Benchmark is 90% complete........."); 
      for(double numberRun = 0; numberRun <= 1000000000; numberRun++) 
      { 
       endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
      } 

      String endTimeHours = SciFair.now("H"); 
     String endTimeMinutes = SciFair.now("mm"); 
     String endTimeSeconds = SciFair.now("ss"); 
     String endTimeMilliseconds = SciFair.now("SSS"); 
     double endTimeHoursNumFormat = Double.valueOf(endTimeHours.trim()).doubleValue(); 
     double endTimeMinutesNumFormat = Double.valueOf(endTimeMinutes.trim()).doubleValue(); 
     double endTimeSecondsNumFormat = Double.valueOf(endTimeSeconds.trim()).doubleValue(); 
     double endTimeMillisecondsNumFormat = Double.valueOf(endTimeMilliseconds.trim()).doubleValue(); 
     double endHoursInSeconds = (endTimeHoursNumFormat * 3600); 
     double endMinutesInSeconds = (endTimeMinutesNumFormat * 60); 
     double endMillisecondsInSeconds = (endTimeMillisecondsNumFormat/1000); 
     double endTotalSeconds = (endHoursInSeconds + endMinutesInSeconds + endTimeSecondsNumFormat + endMillisecondsInSeconds); 

     double elapsedTime = (endTotalSeconds - startTotalSeconds); 

     System.out.println("\nThe benchmark is complete at " + SciFair.now("H:mm:ss:SSS") + ", and the end result is " + endNum + "."); 
     System.out.println("\nThe benchmark was run in " + timeInSeconds.format(elapsedTime) + " seconds."); 
     } 

     else 
     { 
      System.out.println("\nPlease restart the program when you are ready to benchmark."); 
     } 
    } 
} 

答えて

5

複数のスレッドを使用しています。これらは自動的にJVMによってコアに委任されます。

編集:のLesson: Concurrencyを参照してください。言いすぎるほどです。

+0

どのように複数のスレッドを使用しますか? –

+0

合意。実行のスレッドが1つだけであれば、プログラムの命令はキューに入れられ、使用可能なコアがあれば実行されます。 – Zannjaminderson

+0

スレッドを使用する方法については、私の編集を参照してください。 – Daniel

0

rawスレッドオブジェクトまたはjava.util.concurrentのクラスのいずれかを使用したいとします。マルチスレッドは無料ではありません!

+0

私は初心者です。私は約3ヶ月前にJavaプログラミングを始めました。これどうやってやるの? –

1

実行する必要があるのは、並列化できるタスクをベンチマークすることです。言い換えれば、タスクは完全に別個のサブ問題に分割できる必要があります。

たとえば、ベンチマークには複数のfor-loopsがあります。それらは別々の問題であり、異なるスレッドに分割することができます。これを行うには

、あなたのコードは、次のようなものになります。

Thread thread1 = new Thread(){public void run(){ 
// your for-loop 
}}; 

あなたはforループをそれぞれのためにそれを行うだろう、そして、あなたがスレッドごとthread1.start();を呼び出しますし。

Threadthread1.join()に電話すると、その作業が完了するまで待つ必要があります。

あなたの新しいマルチスレッド・コードは、次のパターンに従います:

Create all threads; 
Start all threads; 
Wait for all threads to complete; 
Report on time taken to complete all threads; 

このベンチマークでは、利用可能なコアの数に基づいて、より速く実行する必要があります。 Javaでは

2

、あなたはこのようにそれを行うことができます。

setUpTimers(); 
    long numberOfLoops=10000L; 
    doSomethingThatTakesALongTime(numberOfLoops); 
    reportTimers(); 

次のようにあなたはこれを書き直すことができます:

は、現在のメインは、次のようになりますと仮定し

setUpTimers(); 
    List<Thread> threads = new ArrayList<Thread>(); 
    long numberOfLoops=10000L; 
    for (int i=0; i<numberOfThreads; ++i) { 
     Thread t = new Thread() { 
     public void run() { 
      doSomethingThatTakesALongTime(numberOfLoops/numberOfThreads); 
     } 
     }; 
     t.start(); 
     threads.add(t); 
    } 
    for (Thread t : threads){ 
     t.join(); 
    } 
    reportTimers(); 

あなたは」これを行うと、「ループの数」が「スレッドの数」で割り切れることを確認します。

+0

+1また、各結合の後に、 'System.out.printf("%d%done%n "、100.0 * index/numberOfThreads);を実行して、結合ループのインデックスを保持することもできます。これは、このマルチスレッド実装では、すべての作業単位がほぼ同時に終了するという事実を強調します。 –

0

Java concurrency tutorialをご覧ください。

基本的に、あなたのプログラムは、1つのことに取り組んでいる1人の同等のものです。複数のコアのメリットを得るには、複数のスレッドが必要です。同じスレッドでも複数のスレッドでも並行して作業する多くの人と同等のものです。複数のコアをテストするための

0
  1. 用途別のスレッド:
  2. あなたの進行コード自体を10回繰り返します。代わりに、重複したコードの大部分を排除するために現在の進捗状況を出力するメソッドを作成してください。
  3. トラッキング時間の変数の代わりに、System.currentTimeMillis()の出力を使用し、SimpleDateFormatオブジェクトを使用して時間を希望の形式で出力します。
  4. 複数の文字列をテストするのではなく、入力をテストする場合は、equalsIgnoreCaseを使用します。 (ユーザーが "oK"と入力するとどうなりますか?)
1

あなたのタイミングコードはちょっと複雑です。ここで経過した秒数を追跡するきれいな方法です:

long start = System.currentTimeMillis(); 

//do work 

long end = System.currentTimeMillis(); 
double elapsedSeconds = (end - start)/1000.0; 

その後、あなただけの現在の時刻を報告してくださいnow()機能が必要になります。

関連する問題