Java:捕获Map中每次迭代的执行时间的问题

7 java time output

我需要捕获迭代中某些代码的执行时间.我决定使用a Map<Integer,Long>来捕获这些数据,其中Integer(key)是迭代次数,Long(value)是该迭代所消耗的时间(以毫秒为单位).

我编写了下面的java代码来计算每次迭代所花费的时间.我想确保在调用实际代码之前所有迭代所花费的时间都为零.令人惊讶的是,下面的代码对于每次执行都表现不同.

有时候,我得到了所需的输出(所有迭代都是零毫秒),但有时候我会得到一些随机迭代的正值甚至是负值.

我尝试用System.currentTimeMillis();以下代码替换:

new java.util.Date().getTime();

System.nanoTime();

org.apache.commons.lang.time.StopWatch

但仍然没有运气.

任何建议为什么一些迭代需要额外的时间以及如何消除它?

package com.stackoverflow.programmer;

import java.util.HashMap;
import java.util.Map;

public class TestTimeConsumption {

    public static void main(String[] args) {
        Integer totalIterations = 100000;
        Integer nonZeroMilliSecondsCounter = 0;
        Map<Integer, Long> timeTakenMap = new HashMap<>();
        for (Integer iteration = 1; iteration <= totalIterations; iteration++) {
            timeTakenMap.put(iteration, getTimeConsumed(iteration));
            if (timeTakenMap.get(iteration) != 0) {
                nonZeroMilliSecondsCounter++;
                System.out.format("Iteration %6d has taken %d millisecond(s).\n", iteration,
                        timeTakenMap.get(iteration));
            }
        }
        System.out.format("Total non zero entries : %d", nonZeroMilliSecondsCounter);
    }

    private static Long getTimeConsumed(Integer iteration) {
        long startTime = System.currentTimeMillis();
        // Execute code for which execution time needs to be captured
        long endTime = System.currentTimeMillis();
        return (endTime - startTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是来自同一代码的5种不同执行的示例输出:

执行#1(不行)

Iteration  42970 has taken 1 millisecond(s).
Total non zero entries : 1
Run Code Online (Sandbox Code Playgroud)

执行#2(好的)

Total non zero entries : 0
Run Code Online (Sandbox Code Playgroud)

执行#3(好的)

Total non zero entries : 0
Run Code Online (Sandbox Code Playgroud)

执行#4(不行)

Iteration  65769 has taken -1 millisecond(s).
Total non zero entries : 1
Run Code Online (Sandbox Code Playgroud)

执行#5(不行)

Iteration    424 has taken 1 millisecond(s).
Iteration  33053 has taken 1 millisecond(s).
Iteration  76755 has taken -1 millisecond(s).
Total non zero entries : 3
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种基于Java的解决方案,确保所有迭代始终如一地消耗零毫秒.我更喜欢使用纯Java代码而不使用分析器来实现此目的.

注意:我也可以通过C代码完成此任务.

ΦXo*_*a ツ 1

你的暗示是对的......System.currentTimeMillis(); 这就是这种情况下要走的路。

不能保证增加整数对象 i 的值在任何系统中都代表毫秒或周期时间......

您应该采用 System.currentTimeMillis()并计算经过的时间

例子:

public static void main(String[] args) {
    long lapsedTime = System.currentTimeMillis();
    doFoo();
    lapsedTime -= System.currentTimeMillis();
    System.out.println("Time:" + -lapsedTime);
}
Run Code Online (Sandbox Code Playgroud)

  • `System.nanoTime()`更适合基准测试。最好不要自己做。 (3认同)
  • [JMH](http://openjdk.java.net/projects/code-tools/jmh/) 是 OpenJDK 的一部分,但打包为单独的项目。由于 Java(JIT 编译的 JVM 语言)的性质,如果不进行一些非常广泛的测试利用,几乎不可能获得可用的基准测试结果。 (2认同)