簡體   English   中英

在循環中聲明變量(Java 優化測試)

[英]Declare variable in loop (Java Optimalization Test)

我很好奇如果我在循環外聲明變量,它應該運行得更快,因為當我在循環內聲明它時,然后在每個循環中系統需要在內存中分配一個新的整數,這需要時間。 我運行了測試,運行時間是:外部:3600ms 內部:1300ms

恰恰相反,這正是我所期望的。 為什么我在里面聲明它會更快?

public class DeclarationTestLoop {

 static double outer = 9500000;
 static double inner = 100;

 static void outside() {
    
    long start = System.currentTimeMillis();
    Integer value = 1;
    
    for(double i=0; i<outer; i++) {         
        for(int k=0; k<inner; k++) {
            value++;
            value--;
        }
    }
    
    long end = System.currentTimeMillis();
    
    System.out.println(end-start);
 }

 static void inside() {
    
    long start = System.currentTimeMillis();
    
    for(double i=0; i<outer; i++) {
        for(int k=0; k<inner; k++) {
            Integer value = 1;
            value++;
            value--;
        }
    }
    
    long end = System.currentTimeMillis();
    
    System.out.println(end-start);
 }  


 public static void main(String[] args) {
    
    
    System.out.println("outside");
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    outside();
    
    System.out.println("inside");
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    inside();
    

    System.out.println("toggle");
    outside();
    inside();
    outside();
    inside();
    outside();
    inside();
    outside();
    inside();
    outside();
    inside();
 }
}

一個可以解釋它的元素是,Java 要找到您的外部變量,它必須首先檢查該變量是否在其自己的范圍內定義。 如果不是,那么它會向外看,...

或者它可以是其他任何東西,或者這些東西的組合。 真正的情況是,在 Java 中,JVM 已經過優化,並且足夠智能,可以檢測到您在循環中使用了一個變量,並且每次都可以對其重新分配進行優化。

在 Java 中,您不應該圍繞“低級技巧”設計代碼,因為您不是使用“低級語言”進行編程。 也許使用 C 你可以嘗試那些技巧,但在 Java 中它有點毫無意義,並且可能會降低代碼的可讀性/可維護性,因為它可能比更好的東西更糟!

暫無
暫無

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

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