我一直在努力优化我的一些代码,并且我得到了一个关于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永远不会被看到.
这是为什么?
我目前正在尝试避免GC_CONCURRENT调用,所以我正在运行我的主循环.我注意到我经常创建一个复杂的对象来进行计算.
所以我的问题是将该对象声明为该类的一个字段而不是在使用它的方法中声明它有助于提高性能?
或者因为我的英语可能会伤害你的大脑,这里的代码示例就是字段
class myclass{
private MyObject myObject;
...
public void myLoopedMethod(...){
myObject = new MyObject(...);
myObject.dostuff;
}
Run Code Online (Sandbox Code Playgroud)
方法示例
class myclass{
...
public void myLoopedMethod(...){
MyObject myObject = new MyObject(...);
myObject.dostuff;
}
Run Code Online (Sandbox Code Playgroud)
正确的范围将是方法,但我怀疑的是,通过使其成为一个字段,内存总是被释放并分配在同一个位置.这是真的,这有助于避免GC调用吗?
此外,我应该做这样的事情,但我感兴趣,如果上述逻辑是有道理的.
class myclass{
private MyObject myObject;
...
public void myMethod(...){
myObject.setNewValues(...);
myObject.dostuff;
}
}
Run Code Online (Sandbox Code Playgroud)