GC优化:对于vs foreach

ggp*_*puz 9 java android garbage-collection memory-management

我一直在努力优化我的一些代码,并且我得到了一个关于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;
}
Run Code Online (Sandbox Code Playgroud)

功能2

public void doCalculations()
{
    for(MyObject o : this.objects)
            for(MyObject o2 : this.objects)
                if(o2 == o)
                    o.value = o2.value;
}   
Run Code Online (Sandbox Code Playgroud)

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

功能1 GC永远不会被看到.

这是为什么?

Lou*_*man 9

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

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

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