黑马程序员技术交流社区

标题: for循环的时间问题? [打印本页]

作者: sun_jun    时间: 2014-2-21 00:43
标题: for循环的时间问题?
class Demo
{
   public static void main(String[] args)
      {
              int[] arr = new int[10000];
              long a, b,c;
              a = System.currentTimeMillis();
            for(int x=0;x<arr.length;x++)
             {  
                 System.out.print("A");
            }

             b = System.currentTimeMillis();
           for(int y=arr.length;y>0;y--)
              {  
             System.out.print("B");
                }

           c = System.currentTimeMillis();
            System.out.println(b-a);
          System.out.println(c-b);
    }
}
这两个for循环除了条件语句不一样外,其余的都差不多,但是最后输出地时间差不一样,前面的b-a大于后面的c-b。
那只有一个可能,就是x<arr.length 运行的时间比较长!为什么运行的时间长呀?求解释!



作者: 北冥有鱼    时间: 2014-2-21 01:08
这也算是线程问题吧,你的A循环和B循环是有严格的先后顺序的,A循环执行结束以后才会开始B循环。所以当B循环开始时A循环已经执行结束了。时间差当然不一样。
作者: .......    时间: 2014-2-21 07:17
时间不一样是正常的 因为CPU的执行权会被抢走的 不一定会一直执行下去。 被抢走时只有停在那里等着再一次的抢回来执行权
作者: ___________゛M    时间: 2014-2-21 08:01
  1. public static void main(String[] args)
  2.     {
  3.             int[] arr = new int[1000];
  4.             long a, b,c;
  5.             int d = 0;
  6.             int e = 0;
  7.             a = System.currentTimeMillis();
  8.          for(int y=arr.length;y>0;y--)
  9.             {  
  10.                  System.out.println(arr.length + "***" + ++e);
  11.            System.out.print("B");
  12.               }
  13.          c = System.currentTimeMillis();
  14.          for(int x=0;x<arr.length;x++)
  15.          {  
  16.                 System.out.println(arr.length + "***" + ++d);
  17.              System.out.print("A");
  18.         }
  19.          b = System.currentTimeMillis();
  20.           System.out.println(c-a);
  21.         System.out.println(b-c);
  22.   }
复制代码

首先我们把两个循环,换一下位置看看输出结果是多少 。54
32很明显 , 也是上面高于下面 。
如果我们把数组扩大成 100000 后 的运行结果是  2592
2732
如果我们再加一个0 之后的运行结果 :27092
26938 可以看到 误差越来越小 。
产生这种情况的原因我想可能是CPU关于时间精度的问题, 其实CPU的时间精度没有我们想像中的那么大,就像你在运行浮点数运算时一样 , 也是有误差的 。  但误差不大,不影响整体的结果 。
作者: peterbu    时间: 2014-6-11 02:50
我来运行一下,看行不行!
作者: 泛小型    时间: 2014-6-12 19:39
赞一个。。。。
作者: 四顾行者    时间: 2014-6-15 17:55
这个不靠谱,你把下面的for循环丢到上面去,结果会不一样
作者: 郝九凤    时间: 2014-6-18 09:48
不能说打印A的循环就比打印B的运行时间长,CPU在运行的时候,除了这个main线程还有一个gc负责垃圾回收的,很难确定,负责垃圾回收的线程是在这两个线程中的哪一个循环中的时间长。我个人认为这些都是随机的没必要深究吧!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2