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

    相關文章:JAVA遍歷機制的性能的比較git

前言

索引隨機訪問數組相信是很常見的操做.github

可是昨天在作leetcode的Reverse String時,發現了很奇怪的現象,具體以下圖數組

for與while時間對比圖

當時我也以爲難以想象,怎麼快了那麼多,因此今天覆盤一下。數據結構

正文

注:這篇文章只涉及原始數組的索引遍歷,不涉及包裝數據結構以及foreachpost

測試代碼
  • 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代碼,可是我猜想是循環執行語句的多少差異。spa

for中,執行順序是debug

  • 判斷循環變量是否越界
  • 執行打印語句
  • 循環變量自增

while中,執行順序是

  • 判斷循環變量是否越界
  • 執行打印語句,循環變量自增

與for相比,while所執行的語句量少掉1/3,因此我以爲這就是緣由。(若是有更好的緣由能夠評論或者發起Issue)

後話

生命不息,技術不止。

不少時候我也爲了代碼量的減小不理會運行時間的差別,此次吸取教訓,以後在實際開發會更加註意時間。

相關文章
相關標籤/搜索