我一直在尝试优化我的一些代码,并且我对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。
为什么?
答案 0 :(得分:9)
一个创建迭代器,另一个不创建迭代器。
GC实际上是您应用程序的瓶颈吗? (似乎不太可能。包括我自己在内的许多开发人员会认为可读性好处超过了几微秒的GC。)
也就是说,无论如何,你的整个循环都是无操作的。
答案 1 :(得分:3)
我的建议是'因为内部for循环为外部for循环的每次运行创建一个Iterator(在 function 2 中)。 此迭代器实例不是在 function 1
中创建的