3

我编写了一个 java 程序,通过运行大量计算然后将其与我朋友的计算机进行匹配来测试处理器的功能。

但是,当我运行该程序时,它并没有使用 100% 的处理器。处理能力从 1-2% 下降到 27%,RAM 保持在 34%。

这只是java或处理器的工作方式吗?还是我的代码有问题?这是处理计算的类(注意:我还在学习如何编程,我对软件与硬件交互的方式很感兴趣):

import javax.swing.JTextPane;

public class Main {

    static int numberToCalculate = 100;
    static int otherNumberToCalculate = 50;
    static String typeOfCalculation = "all";
    static int calculated;
    static int calculations = 10000000;

    public static void calculate(JTextPane j, JTextPane j2) {
        long time = System.currentTimeMillis();
        for(int i = 0; i <= calculations; i++) {

            switch(typeOfCalculation) {
            case "Divide":
                calculated = numberToCalculate / otherNumberToCalculate;
                break;

            case "Multiply":
                calculated = numberToCalculate * otherNumberToCalculate;
                break;

            case "Plus":
                calculated = numberToCalculate + otherNumberToCalculate;
                break;

            case "Minus":
                calculated = numberToCalculate - otherNumberToCalculate;
                break;

            case "All":
                calculated = numberToCalculate / otherNumberToCalculate;
                calculated = calculated * otherNumberToCalculate;
                calculated = calculated + otherNumberToCalculate;
                calculated = calculated - otherNumberToCalculate;
                break;

            default:
                Test.UpdateText(j, "Error, please pick type of calculation.");
                Test.UpdateText(j2, "Error, please pick type of calculation.");
                break;
            }
            if(i == calculations) {
                Test.UpdateText(j, "Milliseconds: " + (System.currentTimeMillis() - time));
                Test.UpdateText(j2, "Result: " + calculated);
            }
        }
    }

    public static void main(String [] args)
    {
        Test.window();
    }

}

这是输出的图片:http: //i.stack.imgur.com/lH1VA.png

4

2 回答 2

8

如果您使用的是多处理器机器,那么您只会使用此代码最大化一个处理器。我会冒昧地猜测您有 4 个处理器(或 2 个带有超线程的处理器)。这可以解释为什么您只能获得 27% 的利用率。

如果您想真正最大化系统中的所有内核,您还需要启动额外的线程来进行计算。

于 2012-07-29T18:59:38.017 回答
2

答案已经给出:您的代码使用单线程,无法使用系统的所有容量。您可以尝试下面的程序进行快速测试 - 它首先也使用单个线程运行,然后它使用所有处理器(您可能需要根据您的机器增加循环的大小(100,000,000)以获得足够的时间看到不同):

public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    Runnable r = new Runnable() {

        @Override
        public void run() {
            double sum = 0;
            for (int i = 1; i < 100000000; i++) {
                sum += Math.log(i);
            }
            System.out.println(sum);
        }
    };

    r.run(); //first run: single thread

    //second run: as many threads as processors
    for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) {
        executor.submit(r);
    }

    executor.shutdown();
}
于 2012-07-29T19:13:36.733 回答