Die Genauigkeit von System.nanoTime () zur Messung der verstrichenen Zeit nimmt nach einem Aufruf von Thread.sleep () ab.

Ich stoße hier auf ein wirklich ungewöhnliches Problem. Es scheint, dass der Aufruf von Thread.sleep (n), wobei n> 0, dazu führen würde, dass die folgenden System.nanoTime () -Aufrufe weniger vorhersehbar sind.

Der folgende Code veranschaulicht das Problem.

Das Ausführen auf meinem Computer (rMBP 15 "2015, OS X 10.11, jre 1.8.0_40-b26) gibt das folgende Ergebnis aus:

Control: 48497
Random: 36719
Thread.sleep(0): 48044
Thread.sleep(1): 832271

Auf einer virtuellen Maschine unter Windows 8 (VMware Horizon, Windows 8.1, sind 1.8.0_60-b27):

Control: 98974
Random: 61019
Thread.sleep(0): 115623
Thread.sleep(1): 282451

Laufen Sie es jedoch auf einem Unternehmensserver (VMware, RHEL 6.7, jre 1.6.0_45-b06):

Control: 1385670
Random: 1202695
Thread.sleep(0): 1393994
Thread.sleep(1): 1413220

Was ist überraschenderweise das Ergebnis, das ich erwarte.

Der Thread.sleep (1) wirkt sich eindeutig auf die Berechnung des folgenden Codes aus. Ich habe keine Ahnung, warum das passiert. Hat jemand eine Ahnung?

Vielen Dank

public class Main {
    public static void main(String[] args) {
        int N = 1000;
        long timeElapsed = 0;
        long startTime, endTime = 0;

        for (int i = 0; i < N; i++) {
            startTime = System.nanoTime();
            //search runs here
            endTime = System.nanoTime();

            timeElapsed += endTime - startTime;
        }

        System.out.println("Control: " + timeElapsed);

        timeElapsed = 0;

        for (int i = 0; i < N; i++) {
            startTime = System.nanoTime();
            //search runs here
            endTime = System.nanoTime();

            timeElapsed += endTime - startTime;

            for (int j = 0; j < N; j++) {
                int k = (int) Math.pow(i, j);
            }
        }

        System.out.println("Random: " + timeElapsed);

        timeElapsed = 0;

        for (int i = 0; i < N; i++) {
            startTime = System.nanoTime();
            //search runs here
            endTime = System.nanoTime();

            timeElapsed += endTime - startTime;

            try {
                Thread.sleep(0);
            } catch (InterruptedException e) {
                break;
            }
        }

        System.out.println("Thread.sleep(0): " + timeElapsed);

        timeElapsed = 0;

        for (int i = 0; i < N; i++) {
            startTime = System.nanoTime();
            //search runs here
            endTime = System.nanoTime();

            timeElapsed += endTime - startTime;

            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                break;
            }
        }

        System.out.println("Thread.sleep(1): " + timeElapsed);
    }
}

rundsätzlich führe ich eine Suche in einer while-Schleife durch, die jede Iteration durch Aufrufen von Thread.sleep () unterbricht. Ich möchte die Ruhezeit von der Gesamtzeit für die Suche ausschließen und benutze daher System.nanoTime (), um die Start- und Endzeiten aufzuzeichnen. Wie Sie oben sehen, funktioniert dies jedoch nicht gut.

Gibt es eine Möglichkeit, dies zu beheben?

Vielen Dank für jede Eingabe!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage