计时方法持续时间:总是显示零秒?

Timing method duration: always showing zero seconds?

我正在尝试计算方法在我的应用程序中花费的时间,问题是计时始终显示为 0 秒。我下面的代码有什么问题?

long currentTimeInMilis = System.currentTimeMillis() % 1000;

    public ClassName() {

        public void timeMethod() {

                long startOfmethod= currentTimeInMilis;

                methodToTime();

                long endOfMethod= currentTimeInMilis;

                long totalTime = endOfMethod= - startOfmethod;

                LOGGER.info("[Method Took: {}", DurationFormatUtils.formatDuration(totalTime, "H:mm:ss", true) + "]\n");                                            
             }
    }

问题是我每次都得到这个输出,尽管我知道它花费的时间超过零秒:

Method took: 0:0:0:

您前后使用了相同的 currentTimeInMilis 变量。这不像同时发生了神奇的改变(好吧,除非 methodToTime 这样做,因为你已经把它变成了一个字段而不是一个局部变量)。您实际上必须在方法完成后再次 调用 System.currentTimeMillis() 才能获得可以与调用方法之前的值进行比较的值。

例如,完全去掉 currentTimeInMilis 字段,参见下面的 ***

public ClassName() {

    public void timeMethod() {

        long startOfmethod = System.currentTimeMillis(); // ***

        methodToTime();

        long endOfMethod = System.currentTimeMillis();   // ***

        long totalTime = endOfMethod = -startOfmethod;

        LOGGER.info("[Method Took: {}", DurationFormatUtils.formatDuration(totalTime, "H:mm:ss", true) + "]\n");
    }
}

请注意,我也删除了 % 1000;只记住值的毫秒部分是没有意义的。

但是,请注意,这仅适用于非常非常粗略的指示(您说过该方法需要两分钟)。有关正确的基准测试,请参阅 How do I write a correct micro-benchmark in Java?