Java 为什么我使用System.nanoTime()获得负运行时间?

Java 为什么我使用System.nanoTime()获得负运行时间?,java,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.nanoTi

我正在尝试将以下代码与
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);
        }
    }
}
为什么我会得到负值


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

可以从CPU时钟周期计数器中获取纳米时间。由于不同的CPU可以在稍有不同的时间启动,因此不同CPU上的时钟计数器可能不同。Linux纠正了这一点,但旧版本的Windows没有。(我假设您有两个CPU,它们的启动间隔为3毫秒)

你偶尔也会看到超过2.5毫秒的正向跳跃

试一试

if(成本<0 | |成本>2000000){

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

无法在Linux上使用Java(TM)SE运行时环境(build 1.6.0_26-b03)重现.无论如何,你为什么抱怨?当Java在90年代很慢的时候,人们抱怨,现在它太快了,人们还在抱怨:-)抱怨?我只是找不到一个正确的方法来测量代码执行时间。与快或慢无关。相关:也不能在Mac上用1.6.0_26-b03复制。@Freewind,对不起,我忍不住开了一个小玩笑你说得很对。新结果:-34948554185715,-3562463620073,4175502,3977789,-3500977,41252489我希望它几乎是交替的。如果有一个非常大的积极结果,进程可以在同一个CPU上停止并重新启动。
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
if (cost < 0 || cost > 2000000) {