2013-10-09 44 views
4

在Java中,如果我有很多本地对象,如果将它们定义为实例变量,它会运行得更快吗?例如,如果我的func1()被多次调用,例如在一个循环中,那么每次调用该函数时,JVM会不会实例化并垃圾收集list2?我应该重复使用相同的list1对象来防止垃圾收集和实例化开销?Java优化:本地变量与实例变量

class A { 
    List list1 = new ArrayList(); 
    private void func1() { 
     list1.clear(); 
     // add new objects list1 

     List list2 = new ArrayList(); 
     // add new objects to list2 
    } 
} 

优化器是否足够智能以跳过垃圾回收并自动重用该对象?

+4

'Optimization.PREMATURE == Math.sqrt(EvilUtils.getAll(Evil.class))'求值真的......你确定这个问题给你带来了问题,还是仅仅是一个过早优化的情况?它闻起来像是我的第二个案例... – ppeterka

+0

只是好奇心。想要了解当我需要坐下来优化我的代码时可用的选项。 – JavaMan

回答

1

我写了JDK1.6一个小的测试程序,下面

结果:
*为dostuff 594ms(即创建本地)
* dmsuff2(使用实例)为58ms

public class Test { 

static long counter=0; 
public static void main(String[] args) { 
    long t1 = System.nanoTime(); 
    Test test = new Test(); 
    for (int i=0;i<1000000000;i++) { 
     test.doStuff();//or dostuff2 
    } 
    long t2 = System.nanoTime(); 
    System.err.println((t2-t1)/1000000); 
    System.err.println(counter); // to check it wasnt optimised away 
} 

private void doStuff() { 
    List l = new ArrayList(); 
    if (l!=null) { 
     counter++; 
    } 
} 

List l2 = new ArrayList(); 
private void doStuff2() { 
    if (l2!=null) { 
     counter++; 
    } 
} 
} 

结果,似乎实例比使用本地,正如人们所预料得更快。

但是,看起来你节省了大约0。每十亿的项目5秒,在我的电脑至少,所以你需要真的需要PERF增益,以证明它

2

GC优化不是正确的方法来决定Local vs Instance变量。如果一个变量需要被多个实例方法使用,那么使用一个实例变量是有意义的。

你说得对,局部变量的使用可能会增加GC活动。

1

在决定是使用本地变量还是实例变量之前,可能需要考虑各种用例。性能可能因用例而异。

一个很好的例子可以在Effective Java发现:Item 5 - “避免创建不必要的对象

+0

+1环节都有很好的解释 – SpringLearner

1

想想也是实例变量值的线程安全。同一对象的两个线程需要同步对实例变量数据的访问,但这里始终是一个新的局部变量数据对象。

1

如果 - 且仅当 - 你已经证明你有,因为创建对象的GC的问题,你应该考虑池是证明要创建昂贵的对象。

对于这一点,你不必重新发明轮子的任何,您可以用FastList.newInstance()呼叫使用Javolutions utils的,FastList在这种情况下,实现这一目标,例如:

List<Whatever> newOrReusedList = FastList.newInstance(); 

...和相应的FastList.recycle(FastList)调用以使其可用于重用。 (感谢@JIV,我忘了补充该位。)

(要小心的是,使用javolutions快速*类可能会导致不同的表现:他们正朝着可预见的性能(实时系统减速),而不是速度,所以可能是使用的情况下,当他们比他们的同行java.lnag执行速度较慢)

+0

但你也需要释放你不后需要手动他们 – JIV

+0

@JIV感谢所有未使用的高速邮件,我忘了补充一点。 – ppeterka