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

マルチプロセッサマシンを使用している場合は、このコードで1つのプロセッサを最大限に活用するだけです。手足に出て、プロセッサが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 に答える