可変 - java 戻り値 クラス



変数をゼロに戻す (4)

私はAmazonの電子ブックの1つを使用してJavaを自分で教えています。 私は、コンピューターの「ベンチマーク」を行うレッスンの1つを行っていました。 これは、1分間ループして結果を計算することによりこれを行います。

基本的には、完了するまで何も表示されません。 そのため、数秒ごとにドットを一種の進行状況バーとして表示するように少し変更していました。 通常、これは些細なことですが、何かが正しくないので、私は何を知りません。

起こることは、miniIndexが指定したしきい値に到達し、miniIndexの値と期間を出力することです。 次に、miniIndexをゼロに設定して、カウンターを再起動できるようにします。 しかし、リセットされず、再び増加することはありません。 非常に奇妙な動作です。

コード全体を次に示します。

class Benchmark {
    public static void main(String[] arguments) {

        long startTime = System.currentTimeMillis();
        long endTime = startTime + 60000;
        long index = 0;

        // My inner index
        int miniIndex = 0;
        //
        while (true) {
            double x = Math.sqrt(index);
            long now = System.currentTimeMillis();
            if (now > endTime){
                break;
            }
            index++;
            // my modification
            miniIndex++;
            if (miniIndex >= 5000) {
                System.out.print(miniIndex + ".");
                miniIndex = 0;
            }
            // end of my modification
        }
        System.out.println(index + " loops in one minute.");
    }
}

https://rueisnom.com


Answer #1

あなたはおそらくあなたの出力か何かを圧倒しているので、何も印刷しません。 ループは60000ミリ秒(1分)まで待機します。 私がそれを実行したとき、 here に私の出力の最後の部分がありました。 ループは非常に高速に反復されるため(ここではボトルネックであるため、コンピューターが印刷できる限り高速)、1秒/ミリ秒あたり1回の反復ではなく、カウンター miniIndex は1秒あたり何回も上がります。 ただし、コードは機能します-思ったとおりに機能しません。

次のようなものを試してみると、わずかに正確な出力が得られる場合があります。

class Benchmark {
    public static void main(String[] arguments) {

        long startTime = System.currentTimeMillis();
        long endTime = startTime + 60000;
        long index = 0;

        // My inner index
        int miniIndex = 0;
        //
        while (true) {
            double x = Math.sqrt(index);
            long now = System.currentTimeMillis();
            if (now > endTime){
                break;
            }
            index++;
            // my modification
            miniIndex++;
            if (miniIndex >= 5000) {
                System.out.print(miniIndex + ".");
                miniIndex = 0;
            }
            // end of my modification
            try {
                Thread.sleep(1);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        System.out.println(index + " loops in one minute.");
    }
}

出力:

.......... 1分で50976ループ。

Thread.sleep(1)は1ミリ秒を少し超えてスリープできるため、1分間に60,000ループを取得できないことに注意してください。


Answer #2

それでもそのタイプの出力で使用したい場合は、 StringBuilder を使用して簡単にすることができます。 それはそのようにコーディングされています:

StringBuilder stringBuilder = new StringBuilder();

そして、そのようなループを入れます:

if (miniIndex >= 5000) {
    stringBuilder.append(miniIndex).append(".");
    miniIndex = 0;
}

if (stringBuilder.length() >= 200) {
    System.out.println(stringBuilder);
    stringBuilder.setLength(0);
}


Answer #3

コードは正常に機能しています。 欠陥があるのはあなたの期待です。

コードは、5,000回の反復ごとにドットを印刷します。 これは基本的に値を吐き出します。 CPUは1秒あたり20億回以上の操作で実行されていることを忘れないでください。 おそらく、1秒あたり数百万のループを実行できます。 とにかく、1秒あたり100ループ、5000で割った値を1秒あたり200ドットと呼びます。


Answer #4

miniIndex++ 操作が何をしているのかを誤解しているのは、ミリ秒をカウントするのでは なく 、互いに等しく ない ループ反復の数をカウントしているためだと思います。 あなたがしたかったことに応じて、5秒ごとに if ステートメントを実行する if コードを修正しました。

public static void main(String[] arguments) {

    long startTime = System.currentTimeMillis();
    long miniTime = startTime; //Declare miniTime equal to startTime
    long endTime = startTime + 60000;
    long index = 0;

    while (true) {
        double x = Math.sqrt(index);
        long now = System.currentTimeMillis();
        if (now > endTime){
            break;
        }
        index++;

        // my modification    
        //Current time minus last time the if executed and check if 5 seconds passed
        if ((now - miniTime) >= 5000) { 
            miniTime = System.currentTimeMillis();
            System.out.println("5 seconds have passed.");

            //if you want to print the actual time elapsed every 5 seconds use this print
            //System.out.println((now - startTime)/1000 + " seconds have passed.");
        }
        // end of my modification
    }
    System.out.println(index + " loops in one minute.");
}

現在の現在時刻を比較し、 miniTime を減算して、5000ミリ秒以上かどうかを確認する miniTime してください。 時間を使用するに は、 それを何らかの方法で、この場合は System.currentTimeMillis() と結果に関連付ける 必要 あり ます。 ループのカウントなどの数値自体に時間の一貫性はありません。

ループは数百万回実行される可能性がありますが、3秒しかかかりません。

出力例:

5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
5 seconds have passed.
16319642816 loops in one minute.

注: 5 seconds have passed. 60秒のマークでループが壊れて最終パスが印刷されないため、11回印刷されます。 ( 11 * 5 は最初の55秒間は55です)。





java