乐趣区

For与while时间的对比

    本文首发于 cartoon 的博客
     转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/for%E4%B8%8Ewhile%E6%97%B6%E9%97%B4%E7%9A%84%E5%AF%B9%E6%AF%94/

    相关文章:JAVA 遍历机制的性能的比较

前言

索引随机访问数组相信是很常见的操作.

但是昨天在做 leetcode 的 Reverse String 时,发现了很奇怪的现象,具体如下图

当时我也觉得不可思议,怎么快了那么多,所以今天复盘一下。

正文

注:这篇文章只涉及原始数组的索引遍历,不涉及包装数据结构以及 foreach

测试代码
  • for
private static void textFor(){int[] data=new int[1000];
        int i=0;
        for(;i<1000;i++){data[i]=i;
        }
        i=0;
        long start=System.currentTimeMillis();
        for(;i<1000;i++){System.out.print(data[i]+" ");
        }
        long end=System.currentTimeMillis();
        System.out.println();
        System.out.println("for use:"+(end-start)+"ms");
    }
  • while
private static void textWhile(){int[] data=new int[1000];
        int i=0;
        for(;i<1000;i++){data[i]=i;
        }
        i=0;
        long start=System.currentTimeMillis();
        while(i<1000){System.out.print(data[i++]+" ");
        }
        long end=System.currentTimeMillis();
        System.out.println();
        System.out.println("while use:"+(end-start)+"ms");
    }
结果
for use:35ms
while use:15ms

for use:14ms
while use:6ms

for use:14ms
while use:8ms

for use:20ms
while use:5ms

所用时间可能不一样,但是大概比例应该跟我的差不多

有点意外的是,while 比 for 竟然要少一倍 (大概) 的时间,颠覆了我之前的认知。

结果分析

虽然我没有 debug 代码,但是我猜测是循环执行语句的多少差别。

for 中,执行顺序是

  • 判断循环变量是否越界
  • 执行打印语句
  • 循环变量自增

while 中,执行顺序是

  • 判断循环变量是否越界
  • 执行打印语句,循环变量自增

与 for 相比,while 所执行的语句量少掉 1 /3,所以我觉得这就是原因。(如果有更好的原因可以评论或者发起 Issue)

后话

生命不息,技术不止。

很多时候我也为了代码量的减少不理会运行时间的差异,这次吸收教训,之后在实际开发会更加注意时间。

退出移动版