我一直在尝试优化我的一些代码,并且得到了关于fors的一个奇怪的结论.
在我的测试用例中,创建了一个具有主要活动的新项目.该活动初始化500个对象的列表,运行一个显式GC并启动该线程.线程循环函数doCalculations.
this.objects是500 MyObject的列表,以前是MyObject,value是int.功能逻辑没有逻辑,他们只是在做任何事情.差异在于内在的.
FUNCTION1
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 GC在我的nexus上被称为每10秒钟,释放〜1.7MB.
使用功能1 GC永远不会被看到.
这是为什么?
解决方法
一个创建一个迭代器,另一个不是.
GC实际上是您的应用程序的瓶颈吗? (似乎不太可能,包括我自己在内的许多开发者都会考虑可读性的好处超过几微秒的GC.)
也就是说,你的整个循环是一个不起眼的反应.