美文网首页
For与while时间的对比

For与while时间的对比

作者: cartoony | 来源:发表于2019-06-24 18:22 被阅读0次

    本文首发于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时,发现了很奇怪的现象,具体如下图

    image

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

    正文

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

    测试代码
    • for

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n18" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace-font); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(15, 17, 26); position: relative !important; border: 1px solid var(--border-color); border-radius: 0.25rem; padding: 0.1em 0.1em 0.1em 0px; line-height: var(--monospace-line-height); margin: 15px 0.2em 18px; width: inherit; color: rgb(143, 147, 162); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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");
    }</pre>

    • while

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n23" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace-font); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(15, 17, 26); position: relative !important; border: 1px solid var(--border-color); border-radius: 0.25rem; padding: 0.1em 0.1em 0.1em 0px; line-height: var(--monospace-line-height); margin: 15px 0.2em 18px; width: inherit; color: rgb(143, 147, 162); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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");
    }</pre>

    结果

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n26" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace-font); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(15, 17, 26); position: relative !important; border: 1px solid var(--border-color); border-radius: 0.25rem; padding: 0.1em 0.1em 0.1em 0px; line-height: var(--monospace-line-height); margin: 15px 0.2em 18px; width: inherit; color: rgb(143, 147, 162); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> for use:35ms
    while use:15ms

    for use:14ms
    while use:6ms

    for use:14ms
    while use:8ms

    for use:20ms
    while use:5ms</pre>

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

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

    结果分析

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

    for中,执行顺序是

    • 判断循环变量是否越界

    • 执行打印语句

    • 循环变量自增

    while中,执行顺序是

    • 判断循环变量是否越界

    • 执行打印语句,循环变量自增

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

    后话

    生命不息,技术不止。

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

    相关文章

      网友评论

          本文标题:For与while时间的对比

          本文链接:https://www.haomeiwen.com/subject/cltaqctx.html