如何让Eclipse中的Java程序使用多个处理核心?

如何让Eclipse中的Java程序使用多个处理核心?,java,eclipse,benchmarking,Java,Eclipse,Benchmarking,我正在做一个科学展项目,研究向处理器添加内核如何影响计算速度。我用Eclipse平台用Java编写了自己的基准测试。我的问题是,当程序运行时,计算机仅使用1个处理内核所需的时间与使用全部6个处理内核所需的时间几乎没有差别。有没有办法让程序使用额外的处理内核,以便在6个内核上运行得更快?以下是代码的副本: import java.util.Calendar; import java.text.SimpleDateFormat; import java.util.Scanner; import ja

我正在做一个科学展项目,研究向处理器添加内核如何影响计算速度。我用Eclipse平台用Java编写了自己的基准测试。我的问题是,当程序运行时,计算机仅使用1个处理内核所需的时间与使用全部6个处理内核所需的时间几乎没有差别。有没有办法让程序使用额外的处理内核,以便在6个内核上运行得更快?以下是代码的副本:

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.");
        }
    }
}
import java.util.Calendar;
导入java.text.simpleDataFormat;
导入java.util.Scanner;
导入java.text.*;
公开课
{
/**
*罗伯茨
* 1/13/11
*2011年科学博览会
*/
现在使用公共静态字符串(字符串日期格式){
Calendar cal=Calendar.getInstance();
SimpleDataFormat sdf=新的SimpleDataFormat(日期格式);
返回sdf.format(cal.getTime());
}
公共静态void main(字符串[]args)
{
扫描仪数据输入=新扫描仪(System.in);
DecimalFormat timeInSeconds=新的DecimalFormat(“##.####”);
System.out.println(“您准备好开始基准测试了吗?”);
字符串响应=dataIn.nextLine();
double num=58325442254165165464454654464654654654484121685446725.2655236355356499923164465434564987418122117324461895791624215795845721213342169579551462159188941999936426445548521652158975;
双端数=0;
if(response.equals(“Yes”)| response.equals(“Yes”)| response.equals(“Ok”)| response.equals(“Ok”))
{
System.out.println(“从“+scifear.now”(“H:mm:ss:SSS”)+”开始的基准测试);
字符串starttimehurs=scifear.now(“H”);
字符串startTimeMinutes=scifear.now(“mm”);
字符串startTimeSeconds=scifear.now(“ss”);
字符串starttimemillesons=scifear.now(“SSS”);
double startTimeHoursNumFormat=double.valueOf(startTimeHours.trim()).doubleValue();
double startTimeMinutesNumFormat=double.valueOf(startTimeMinutes.trim()).doubleValue();
double StartTimeSecondsUMFormat=double.valueOf(startTimeSeconds.trim()).doubleValue();
double StartTimeMillSecondSnumFormat=double.valueOf(startTimeMillSeconds.trim()).doubleValue();
双startHoursInSeconds=(startTimeHoursNumFormat*3600);
双StartMinutesUnseconds=(startTimeMinutesNumFormat*60);
双启动毫秒秒=(启动毫秒秒格式/1000);
双startTotalSeconds=(StartToUrsInsectonds+StartMinutesInsectonds+StartTimeSecondsSnumFormat+StartMills秒);

for(double numberRun=0;numberRun),通过使用多个线程。这些线程由JVM自动委托给内核


编辑:请参阅中的。有太多的话要说。

您希望使用原始线程对象或java.util.concurrent中的类。多线程不是免费提供的!

您需要做的是对可并行化的任务进行基准测试。换句话说,该任务需要能够拆分为完全独立的子问题

例如,在基准测试中有许多For循环,它们是独立的问题,可以划分为不同的线程

为此,您的代码将类似于以下内容:

Thread thread1 = new Thread(){public void run(){
// your for-loop
}};
您将为每个for循环执行此操作,然后,您将为每个线程调用
thread1.start();

然后,您需要在每个
线程上调用
thread1.join()
,等待该工作完成

新的多线程代码将遵循以下模式:

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

根据可用内核的数量,此基准测试应该执行得更快。

在Java中,您可以这样做:

   setUpTimers();
   long numberOfLoops=10000L;
   doSomethingThatTakesALongTime(numberOfLoops);
   reportTimers();
假设您当前的main如下所示:

   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();
setUpTimers();
List threads=new ArrayList();
长循环数=10000L;
对于(inti=0;i请查看

基本上,您的程序相当于一个人处理一件事情。要获得多个内核的好处,您需要多个线程——相当于许多人并行处理同一件事情或多件事情

  • 使用单独的螺纹进行多芯测试:
  • 您的进度代码会重复10次。请创建一个方法来打印当前进度,以消除大部分重复代码
  • 使用
    System.currentTimeMillis()
    的输出,并使用SimpleDataFormat对象以所需的格式输出时间,而不是使用少量用于跟踪时间的变量
  • 在测试输入时使用equalsIgnoreCase,而不必测试多个字符串。(如果用户键入“oK”?)

  • 顺便说一句:你的计时代码有点过于复杂了。这里有一个更干净的方法来跟踪已经过去的秒数:

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

    那么你只需要你的
    now()
    函数来报告当前时间。

    同意。只需执行一个线程,程序的指令就可以排队,并在任何可用的内核上运行。我只是一个初学者,我大约3个月前才开始编写Java。如何做到这一点?+1,您还可以在连接循环上保留索引
    System.out.printf(“%d%done%n”,100.0*index/numberOfThreads);
    在每次连接之后。这将突出显示一个事实,即在这个多线程实现中,所有工作单元都将在大致相同的时间结束。