有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在做一个科学展项目,研究向处理器添加内核如何影响计算速度。我用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.");
        }
    }
}

共 (6) 个答案

  1. # 1 楼答案

    在Java中,您可以这样做:

    假设您当前的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();
    

    如果这样做,您需要确保“循环数”可以被“线程数”平均整除

  2. # 2 楼答案

    看看Java concurrency tutorial

    基本上,你的程序相当于一个人在做一件事。要获得多核的好处,需要多个线程——相当于许多人在同一件事或多件事上并行工作

  3. # 3 楼答案

    您想要使用java中的原始线程对象或类。util。同时发生的多线程不是免费的

  4. # 5 楼答案

    你需要做的是对一个可并行的任务进行基准测试。换句话说,任务需要能够被分解成完全独立的子问题

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

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

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

    您将为每个for循环执行该操作,然后为每个线程调用thread1.start();

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

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

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

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

  5. # 6 楼答案

    顺便说一句:你的计时代码有点过于复杂了。以下是一种更清晰的方法来跟踪已过的秒数:

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

    然后只需要now()函数来报告当前时间