9

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

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

this.objects 是 500 个 MyObject 的列表,previous 是 MyObject,value 是 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;
}

功能二

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

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

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

这是为什么?

4

2 回答 2

10

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

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

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

于 2012-12-21T21:55:31.313 回答
3

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

于 2012-12-21T21:58:28.350 回答