簡體   English   中英

循環完成所花費的總時間對於每次執行總是不同的

[英]Total time taken by a loop to complete always different for each execution

我有一個簡單的下面的程序,它遍歷一個數組

Integer [] intArray = new Integer[20000];
    int index=0;
    for(int i=10000; i>=0; i--){
        intArray[index]=i;
        index++;
    }

    long startTime = System.currentTimeMillis();
    for(Integer t : intArray){

        System.out.println(t);
    }
    long endTime = System.currentTimeMillis();
    long consumedTime = endTime-startTime;
    System.out.println("Consumed time "+ consumedTime);

我總是得到不同的消耗時間值,如743,790,738,825,678。

為什么for循環所花費的時間對於每次執行總是不同的。

注意我在main方法中運行此代碼。 我的操作系統是Ubuntu,處理器是32位。

因為你的程序不是機器上運行的唯一東西。 操作系統本身,所有其他應用程序等......它們也占用了CPU時間 - 並不總是完全相同的數量。

Java程序沒有具體的時間。 這取決於機器上運行的是什么。 此外,因為您使用Integer需要更多時間。 如果你只是本土差異可能會更少。

這是因為在運行java程序時,操作系統會切換任務並執行大量的同步操作。 如果操作系統在運行時沒有大量處理,程序可以很快,而且當操作系統繁忙時,它也可能很慢。

換句話說,每次程序運行時,操作系統都會執行一組不同的並發任務,執行時間也不同。

因為Java不承諾執行時間。 在現代操作系統中,有很多事情一下子發生。

即使時間不一樣,我也沒有看到太多變化。

可靠地分析Java程序遠非微不足道。 除了你的機器上的其他進程所造成的變化,已經在其他答案中指出,如果它具有即時編譯器,你還會因垃圾收集和虛擬機的有趣效果而獲得不確定性。

在您的示例中,垃圾收集實際上不是問題,但JIT編譯可能會導致前幾個循環迭代明顯慢於接下來的幾千個循環迭代。 因此,將總時間除以迭代次數以獲得每次迭代的平均時間的良好近似是錯誤的。

為了避免這種影響,您必須在開始測量之前多次“鍛煉”循環體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM