我有一个Sutherland-Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时。IEnumerators是否需要比数组更多的资源?
我想知道如果最好是返回普通数组,或者如果我可以返回一个IEnumerator,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的想放弃对GC.Collect()的调用。
我猜垃圾收集器也需要收集IEnumerators,并且可能还有一些相关的开销?
我有一个Sutherland-Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时。IEnumerators是否需要比数组更多的资源?
我想知道如果最好是返回普通数组,或者如果我可以返回一个IEnumerator,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的想放弃对GC.Collect()的调用。
我猜垃圾收集器也需要收集IEnumerators,并且可能还有一些相关的开销?
当使用生成器协例程(功能与许多yield return
s),没有数组被创建或分配。一切都以流媒体的方式完成。这是完全可能的,如果没有得到一个内存不足的错误工作无限发电机:
public static IEnumerable<int> Odds(){
for (int i = 1 ; ; i += 2)
yield return i;
}
因此,如果您经常回大阵只进行迭代,并立即布置,带来的好处将是巨大的,因为存储器分配将会小得多。垃圾收集器的调用次数会减少,而且工作量会减少。
谢谢!这是我正在调查的内容。任何关于引入多少开销的想法? – Steinbitglis 2013-04-29 13:25:47
如何清理所有的枚举类? – 2013-04-29 13:26:42
@Steinbitglis:理论上,它不会引入比阵列更多的开销。而不是分配和返回一个数组,然后返回一个IEnumerator。两者之间的开销相当,因为分配仅发生在第一个收益回报上。 – linepogl 2013-04-29 13:38:05
首先,创建你的大阵列并将其保存在内存中。应用程序的其余部分可以检索对该数组的引用并遍历它。
最好的方法和最快的速度来通过一个数组使用for
。
如果您正在使用foreach
,加班(在水下)一个枚举类是创建,它将在完成其职责后需要清理。
我想你的意思是'IEnumerable's(generic或otherwise)。大多数情况下,这些都是托管集合,一般来说,在阵列上会有一些内存开销(当然,还需要收集)。 – Oded 2013-04-29 13:07:30
你在哪里或为什么要调用GC.Collect()?这通常几乎不可取。如果你在你的游戏循环中运行该算法,你应该真的*重用*你的集合,不管它是一个数组还是其他东西,否则分配/释放可能是一个巨大的性能。 – 2013-04-29 13:13:06
我真的认为我的意思是IEnumerator。无论如何,我并不是指实现IEnumerable的某个集合,而是一个可以实现多个返回的函数。 – Steinbitglis 2013-04-29 13:14:07