循环的性能考虑因素

时间:2011-05-05 14:08:41

标签: java performance

两个代码段之间是否存在任何重大性能问题?

 User user 

 for(int i =0 ; i < 100 ; i++) {
        user = new User() ;

 }

for(int i =0 ; i < 100 ; i++) {
       User user = new User() ;
 }

这只是宣言。

6 个答案:

答案 0 :(得分:5)

有一个神话,这确实有所作为,但Java编译器足够聪明,以确保它没有。 This blogthis blog显示两种声明类型之间生成的字节代码。没有显着的性能差异。

区别在于您发现更具可读性。

答案 1 :(得分:4)

没有。如果仅在循环中使用user,则优先选择第二个,但没有性能差异。

答案 2 :(得分:3)

答案:完全一样。

我创建了两个C1和C2类:

class C1 {
    public void test() {
        String user;        
        for(int i =0 ; i < 100 ; i++) {
            user = new String("s" + i);
            System.out.println(user);        
        }

    }
}

并且

class C2 {
    public void test() {
        for(int i =0 ; i < 100 ; i++) {
            String user = new String("s" + i);
            System.out.println(user);        
        }

    }
}

使用“javac -source 1.4 -target 1.4”(或1.3)编译它们并对类进行反编译后,我得到了相同的代码:

import java.io.PrintStream;

class C1
{

    C1()
    {
    }

    public void test()
    {
        for(int i = 0; i < 100; i++)
        {
            String s = new String("s" + i);
            System.out.println(s);
        }

    }
}

import java.io.PrintStream;

class C2
{

    C2()
    {
    }

    public void test()
    {
        for(int i = 0; i < 100; i++)
        {
            String s = new String("s" + i);
            System.out.println(s);
        }

    }
}

使用“javac -source 1.5 -target 1.5”(或1.6)编译它们并对类进行反编译,我也得到了相同的代码:

import java.io.PrintStream;

class C1
{

    C1()
    {
    }

    public void test()
    {
        for(int i = 0; i < 100; i++)
        {
            String s = new String((new StringBuilder()).append("s").append(i).toString());
            System.out.println(s);
        }

    }
}

import java.io.PrintStream;

class C2
{

    C2()
    {
    }

    public void test()
    {
        for(int i = 0; i < 100; i++)
        {
            String s = new String((new StringBuilder()).append("s").append(i).toString());
            System.out.println(s);
        }

    }
}

答案 3 :(得分:1)

创建新对象将占用此处99%的时间。你在循环中做什么或放置局部变量的位置并不重要。

答案 4 :(得分:0)

应该没有显着差异。在两个循环体中,您为新的User分配内存。

答案 5 :(得分:0)

同样的问题经常发布。是什么让你认为以任何方式声明变量都很重要。在两个版本中都创建了100个用户对象。完全相同的代码生成。

唯一的区别是这个变量的范围,在版本1中你可以从循环外部访问变量User,在版本2中你不能。取决于是否需要它更喜欢第一个或第二个版本。