2013-04-29 45 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,加班(在水下)一個枚舉類是創建,它將在完成其職責後需要清理。

相關問題