java - 为什么我使用 System.nanoTime() 时得到负运行时间?

标签 java nanotime

我正在尝试将以下代码与 System.nanoTime() 结合使用来测量代码的运行时间。

public static void main(String[] args) throws Exception {
    while (true) {
        long start = System.nanoTime();
        for (int i = 0; i < 10000; i++)
            ;
        long end = System.nanoTime();
        long cost = end - start;
        if (cost < 0) {
            System.out.println("start: " + start + ", end: " + end + ", cost: " + cost);
        }
    }
}

我得到这样的结果:

start: 34571588742886, end: 34571585695366, cost: -3047520
start: 34571590239323, end: 34571586847711, cost: -3391612
start: 34571651240343, end: 34571648928369, cost: -2311974
start: 34571684937094, end: 34571681543134, cost: -3393960
start: 34571791867954, end: 34571788878081, cost: -2989873
start: 34571838733068, end: 34571835464021, cost: -3269047
start: 34571869993665, end: 34571866950949, cost: -3042716
start: 34571963747021, end: 34571960656216, cost: -3090805
start: 34571965020545, end: 34571961637608, cost: -3382937
start: 34572010616580, end: 34572007613257, cost: -3003323

为什么我得到负值?

(操作系统:windows xp sp3,java:jdk1.6u27)

最佳答案

nanoTime 可以取自 CPU 时钟周期计数器。由于不同的 CPU 可以在稍微不同的时间启动,因此不同 CPU 上的时钟计数器可能不同。 Linux 对此进行了纠正,但旧版本的 Windows 却没有。 (我假设你有两个 CPU,它们相隔 3 毫秒启动)

您还应该偶尔看到超过 2.5 毫秒的正跳跃。

尝试

if (cost < 0 || cost > 2000000) {

当进程在 CPU 之间切换时,您应该看到一些向前跳和一些向后跳。

关于java - 为什么我使用 System.nanoTime() 时得到负运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866206/

相关文章:

java - Android NDK r4 san-angeles 问题

Java,当一个对象被反序列化并包含其他对象时,每个包含的对象都是一个唯一的实例吗?

android - nanoTime 和 elapsedRealtimeNanos 哪个更适合计时?

Java System.nanoTime() 与 System.currentTimeMillis()。为什么他们有不同的输出?

java - .toNanos() 方法无法正常工作

java - sqlite - 如何在Where子句中使用变量?

java - HTTPClient - .releaseConnection 的 NoSuchMethodError

Java 按键监听器网格游戏

Android - 测量通过 Intent 打开 Activity 与收到结果之间的时间

c++ - 为什么 chrono::system_clock 返回微秒而 clock_gettime 返回纳秒