GC优化:对于foreach

我一直在试图优化我的一些代码,并且对于fors有一个奇怪的结论。

在我的testing案例中,我创build了一个主要活动的新项目。 该活动初始化500个对象列表,运行显式GC并启动线程。 线程循环函数doCalculations。

this.objects是500 MyObject的列表,previous是MyObject,value是int。 function逻辑不保持逻辑,他们只是在那里做东西。 区别在于内在。

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; } 

function2

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

使用函数2 GC在每个约10秒的时间内调用,释放〜1.7MB。

使用function1 GC是永远不会被看到的。

这是为什么?

Solutions Collecting From Web of "GC优化:对于foreach"

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

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

这就是说,无论如何,你的整个循环都是无用的。

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