我写了个非常简单的测试循环时间的程序,如下:import java.util.Date;public class loop {
    public static void main(String [] args) throws Exception {    Date d1 = new Date();
    for(int i=0; i<100; i=i+1){ Thread.sleep(1); }  //loop1, 每次循环sleep 1ms
    Date d2 = new Date();    Date d3 = new Date();
    for(int i=0; i<100; i=i+1){ Thread.sleep(0); }  //loop2,空循环
    Date d4 = new Date();    long loop1 = d2.getTime()-d1.getTime(); //loop1循环花费的时间
    System.out.print("Loop1 Time: " + loop1 + " (ms)" + '\n');    long loop2 = d4.getTime()-d3.getTime(); //loop2循环花费的时间
    System.out.print("Loop2 Time: " + loop2 + " (ms)" + '\n');
  }
}
输出是Loop1 Time: 203 ms
         Loop2 Time: 0 ms
我有点不明白,第一个循环loop1花费的时间是203ms,再减去sleep的时间100*1ms,就应该得到的是空循环的时间103ms啊。但是第二个空循环loop2花费的时间却是0ms而不是103ms。Why?我的计算方法有问题?请问,如果我设置了Thread.sleep(1);得到了循环的时间,该用何种计算方式可以推导出删除这句sleep(1)语句的循环时间? 谢谢~!

解决方案 »

  1.   

    试了一下,Loop1 Time不一定是203,loop2 Time也不一定是0,这个时间应该是不确定的,因为在执行for循环的时候,java和系统还有其它线程和进程在运行,涉及到时间片的切换,所以得到的时间差不一定是for循环的时间。这是我的理解,不一定对,有待高手的指点。
      

  2.   

    试了,弄不明白是怎么一回事。
    我个人认为用Thread.sleep(1)去测试循环时间是不对的。不过也支持一下
      

  3.   

    多县城切换,所以不一定是你计算的那个数值。
    测试了一下,loop应该是每次运行结果都不一定相同。
    因public long getTime()返回long型,数太小,有时感觉第二个总是0
      

  4.   

    用System.currentTimeMillis()试了一遍,还是那个结果,不明白为什么.