我正在运行涉及创建树的模拟。 我的树有2/3到7/8的分支因子。垃圾收集器vs池
每次我需要扩展它,我为孩子分配一个数组。 很多时候,我通过设置一个根的子树作为一棵树的新树(所以我的树的其余部分变成垃圾)。我想知道是否让垃圾收集器做他的工作更好(我建议“当我更改树根时,他开始收集System.gc()),或实现我自己的TreeNodes池,当我更改根目录时,请回收所有现在无用的节点。
答案可以理解为:是非常优化的Android垃圾收集器,还是限制对象的创建/销毁,即使这很耗时?(我需要遍历所有树,并追加每个无用的节点堆栈为我的池)
我读到,Android GC不是“进化”(它基本上运行时,你有低内存。)此外,我不知道是否删除每一个引用树的根会让gc垃圾一次收集所有的树,或者它只会gc节点,然后该节点的子节点再次通过,依此类推。
我已经阅读过那篇文章(是的,它真的很有趣),但我正在专门讨论android gc。在我的应用程序中,它经常运行(logcat打印GC_Concurrent,空闲x%y/z,采用5ms + 6ms)。在我的应用程序不是一个性能问题(它仍然运行60fps),我最想知道的最佳做法**为Android(移动)**平台(文章是从2008年,所以我不认为它可以应用在android gc上,另外我认为android gc在以后的版本中有很大的改变) – 2012-02-10 11:43:09
实现你自己的treenodes实际上是解决它的一个有趣的方法。问题是你在这里测量什么。如果你不衡量性能,那么内存利用率?除非你知道你在这里测量什么,否则你不知道可以给你带来什么好处。GC是否占用了太多时间,难道你没有得到你期望从你的应用程序的回应?它占用了太多的内存吗?你认为通过编写自己的游泳池,你会提高gc吗?如果gc是你的问题,那么你应该测量gc耗尽多少时间,然后写下你的池子,然后再测量一次。你测量了吗? – Siddharth 2012-02-10 11:56:11
我已经有了一个通用池,因此为我的TreeNode编写一个池是在请求TreeNode并遍历树以在回收TreeNode时回收所有子节点时更新为正确值的问题。内存现在不会出现问题(我还没有尝试过很长时间的模拟,因为我的代码中仍然有一些bug需要解决),而且cpu也不算太多,但是因为我在移动设备上运行,我的代码效率越高,电池消耗越少,使用户浪费,而Android对这个问题也很残酷(它清楚地显示了一个应用消耗多少电量)。不,我不测量..(好点) – 2012-02-10 12:10:32