首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mono2.6 (.Net 3.5)中,将项目列表从树父节点传递到叶子节点的最有效的GC方法是什么?

在Mono2.6 (.Net 3.5)中,将项目列表从树父节点传递到叶子节点的最有效的GC方法是什么?
EN

Stack Overflow用户
提问于 2013-02-17 19:26:13
回答 2查看 133关注 0票数 0

所以我们有一个基于类的树,就像这样(伪代码):

代码语言:javascript
复制
class TreeItem {
    private TreeItem parent;
    private List<TreeItem> leaves;
   public void Filter(List<Target> targets) { /* filter given list and pass to all leaves */ }
}

这让GC从字面上哭了出来-它偶尔会掉下来,FPS降到15,它过滤了大约2.5兆的垃圾。

我们调用每个帧的函数,这是我们无法避免的。我们真的不想调用每个帧/每个N帧的GC.collect

我们传递给子集合的列表是通过LINQ表达式生成的,末尾带有.ToList() (传递过滤出的IEnumerator (意味着链接到原始集合的部分)会使性能下降更低)。

在我们的Filter函数中,我们不修改给定的集合--只是过滤它。

所以我的问题是:如何保持至少相同的过滤性能,并摆脱GC丢失我们的fps?

EN

回答 2

Stack Overflow用户

发布于 2013-02-17 19:39:01

您没有确切地说哪种类型的对象占用了所有的内存,但是从您提到的ToList()看起来您正在创建大量的List实例,以及可能的LINQ内部的中间对象。

为了减少GC压力,您需要减少分配量。您不应该在每个Filter()中分配新的列表实例。也许您甚至不应该使用List,而应该使用O(1)表示删除的其他数据结构。或者,不要从列表中删除元素,而是将应该删除的元素替换为某个占位符(null也可以)。

票数 0
EN

Stack Overflow用户

发布于 2013-02-17 19:39:31

您可能需要考虑分别处理每个目标:

代码语言:javascript
复制
public void Filter(Target target)

这样,就不需要分配任何东西了。而且你需要多次调用MoveNext()Current,而调用Filter()的次数很多,所以忽略GC时的性能也不会受到影响。(虽然它可以,但MoveNext()Current可以内联,但对Filter()的递归调用不能。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14920555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档