Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中声明变量(Java优化测试)_Java_Loops - Fatal编程技术网

在循环中声明变量(Java优化测试)

在循环中声明变量(Java优化测试),java,loops,Java,Loops,我很好奇,如果我在循环外部声明变量,它应该运行得更快,因为当我在循环内部声明变量时,那么在每个循环中,系统需要在内存中分配一个新的整数,这需要时间。 我运行了测试,运行时是: 室外:3600毫秒 内部:1300ms 这与我的预期正好相反。为什么我在里面申报会更快 public class DeclarationTestLoop { static double outer = 9500000; static double inner = 100; static void outside(

我很好奇,如果我在循环外部声明变量,它应该运行得更快,因为当我在循环内部声明变量时,那么在每个循环中,系统需要在内存中分配一个新的整数,这需要时间。 我运行了测试,运行时是: 室外:3600毫秒 内部: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();
 }
}
公共类DeclarationTestLoop{
静态双外=9500000;
静态双内=100;
外部静态无效(){
长启动=System.currentTimeMillis();
整数值=1;

对于(double i=0;i一个可以解释这一点的元素是Java要找到外部变量,它必须首先检查变量是否定义在它自己的范围内。如果不是,那么它会向外看

事实上,在Java中,JVM是非常优化的,它足够智能,可以检测到您在循环中使用了一个变量,并且每次重新分配它都可以得到优化


在Java中,您不应该围绕“低级技巧”设计代码,因为您不是在用“低级语言”编程.也许使用C你可以尝试这些技巧,但在Java中,这有点毫无意义,可能会降低代码的可读性/可维护性,因为这可能是最好不过的!

不要使用
System.currentTimeMillis()
而是
System.nanoTime()
---结果可重复吗?---您是否给了代码一个机会让其变热?---您是否使用了微型基准线束,例如?---请阅读: