Java,有时我读到两个 System.currentTimeMillis() 之间的负差异

Java, sometimes I read a negative difference between two System.currentTimeMillis()

慢跑sample of mine, I am having some performances issue

我想在 cpu 方面分析它,我正在使用 System.currentTimeMillis()。

这是我的应用程序的主循环:

    @Override
    public void display(GLAutoDrawable glad) {

    frameTimer.stop();

    frameDelta = frameTimer.getTime();

    // just an estimate
    totalTime += frameDelta;

    transformer.update(frameDelta);

    frameTimer.reset();

    GL4 gl4 = glad.getGL().getGL4();

    frameTimer.start();

    draw(gl4);

    checkGlError(gl4);

    glad.swapBuffers();
}

frameDelta 是具有以下方法的 class

    private long startTime;
    private long diffTime;
    private boolean running;


    public NvStopWatch() {
        running = false;
    }

    /**
     * Start time measurement.
     */
    public void start() {
        startTime = System.currentTimeMillis();
        running = true;
    }

    /**
     * Stop time measurement.
     */
    public void stop() {
        diffTime = getDiffTime();
        running = false;
    }

    /**
     * Reset time counters to zero.
     */
    public void reset() {
        diffTime = 0;
        if (running) {
            start();
        }
    }

    public float getTime() {
        float ms = running ? getDiffTime() : diffTime;
        return ms / 1000;
    }

    /**
     * Get difference between start time and current time.
     *
     * @return
     */
    private long getDiffTime() {
        long now = System.currentTimeMillis();
        long diff = now - startTime;
        if (diff < 0) {
            System.out.println("diff " + diff + " now " + now + " startTime " + startTime);
            diff = (long) BindlessApp.minimumFrameDeltaTime;
        }
        return diff;
    }

如你所见,其方法的调用顺序是.stop().getTime().reset().start()

有时,.getTime() 会返回一个负值..只是随机的,没有任何模式或其他东西

怎么可能?

编辑: 我在 windows 7 x64 上做了一些测试(没有任何 volatilesynchronizednanoTime()),我在那里没有得到任何负增量.. 只有在 ubuntu 15.04 x64..

无论如何,不​​幸的是 Ubuntu volatilesynchronized 没有帮助,nanoTime() 反而有用。

你对此有合理的解释吗? java 实现有问题吗?我正在使用 webupd8team、8u45.

之一

当后台任务更新时间时,可能会发生这种情况,可能是为了纠正偏差。

你大可放心System.nanoTime不会倒退

引用System.nanoTime()

The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative).