Jav*_*Man 5 java garbage-collection compiler-optimization
在Java中,如果我有很多本地对象,如果我将它们定义为实例变量,它会运行得更快吗?例如,如果我的 func1() 被多次调用(比如在一个循环中),那么每次调用该函数时,JVM 是否会继续实例化 list2 并进行垃圾收集?我是否应该重用相同的 list1 对象来防止垃圾收集和实例化开销?
class A {
List list1 = new ArrayList();
private void func1() {
list1.clear();
// add new objects list1
List list2 = new ArrayList();
// add new objects to list2
}
}
Run Code Online (Sandbox Code Playgroud)
优化器是否足够聪明,可以跳过垃圾收集并自动重用对象?
我用jdk1.6写了一个小测试程序,如下
结果:
* dostuff 594ms(创建本地)
* dostuff2 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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,正如人们所期望的那样,该实例似乎比使用本地实例更快。
然而,似乎每十亿个项目可以节省大约 0.5 秒,至少在我的电脑上是这样,所以您确实需要性能增益来证明它的合理性
| 归档时间: |
|
| 查看次数: |
2733 次 |
| 最近记录: |