GC优化:对于vs foreach

时间:2012-12-21 21:53:00

标签: java android memory-management garbage-collection

我一直在尝试优化我的一些代码,并且我对fors得出了一个奇怪的结论。

在我的测试用例中,我创建了一个主要活动的新项目。该活动初始化一个包含500个对象的List,运行显式GC并启动该线程。该线程循环函数doCalculations。

this.objects是500 MyObject的列表,以前是MyObject,值是int。函数逻辑没有逻辑,它们就是那里的东西。区别在于内在。

功能1

public void doCalculations()
{
    for(MyObject o : this.objects)
            for(int i=0; i<this.objects.size(); i++)
                if(this.objects.get(i) == o)
                    o.value = this.objects.get(i).value;
}

功能2

public void doCalculations()
{
    for(MyObject o : this.objects)
            for(MyObject o2 : this.objects)
                if(o2 == o)
                    o.value = o2.value;
}   

使用功能2在我的nexus上每10秒调用一次GC,释放~1.7MB。

使用功能1永远不会看到GC。

为什么?

2 个答案:

答案 0 :(得分:9)

一个创建迭代器,另一个不创建迭代器。

GC实际上是您应用程序的瓶颈吗? (似乎不太可能。包括我自己在内的许多开发人员会认为可读性好处超过了几微秒的GC。)

也就是说,无论如何,你的整个循环都是无操作的。

答案 1 :(得分:3)

我的建议是'因为内部for循环为外部for循环的每次运行创建一个Iterator(在 function 2 中)。 此迭代器实例不是在 function 1

中创建的