2013-04-29 37 views
1

我有一个Sutherland-Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时。IEnumerators是否需要比数组更多的资源?

我想知道如果最好是返回普通数组,或者如果我可以返回一个IEnumerator,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的想放弃对GC.Collect()的调用。

我猜垃圾收集器也需要收集IEnumerators,并且可能还有一些相关的开销?

+1

我想你的意思是'IEnumerable's(generic或otherwise)。大多数情况下,这些都是托管集合,一般来说,在阵列上会有一些内存开销(当然,还需要收集)。 – Oded 2013-04-29 13:07:30

+3

你在哪里或为什么要调用GC.Collect()?这通常几乎不可取。如果你在你的游戏循环中运行该算法,你应该真的*重用*你的集合,不管它是一个数组还是其他东西,否则分配/释放可能是一个巨大的性能。 – 2013-04-29 13:13:06

+0

我真的认为我的意思是IEnumerator。无论如何,我并不是指实现IEnumerable的某个集合,而是一个可以实现多个返回的函数。 – Steinbitglis 2013-04-29 13:14:07

回答

1

当使用生成器协例程(功能与许多yield return s),没有数组被创建或分配。一切都以流媒体的方式完成。这是完全可能的,如果没有得到一个内存不足的错误工作无限发电机:

public static IEnumerable<int> Odds(){ 
    for (int i = 1 ; ; i += 2) 
    yield return i; 
} 

因此,如果您经常回大阵只进行迭代,并立即布置,带来的好处将是巨大的,因为存储器分配将会小得多。垃圾收集器的调用次数会减少,而且工作量会减少。

+0

谢谢!这是我正在调查的内容。任何关于引入多少开销的想法? – Steinbitglis 2013-04-29 13:25:47

+0

如何清理所有的枚举类? – 2013-04-29 13:26:42

+0

@Steinbitglis:理论上,它不会引入比阵列更多的开销。而不是分配和返回一个数组,然后返回一个IEnumerator。两者之间的开销相当,因为分配仅发生在第一个收益回报上。 – linepogl 2013-04-29 13:38:05

0

首先,创建你的大阵列并将其保存在内存中。应用程序的其余部分可以检索对该数组的引用并遍历它。

最好的方法和最快的速度来通过一个数组使用for

如果您正在使用foreach,加班(在水下)一个枚举类是创建,它将在完成其职责后需要清理。

相关问题