簡體   English   中英

C#中迭代器的內存使用情況

[英]Memory usage of iterators in C#

在C#中使用大量迭代器對內存使用有什么影響? 讓我們假設一個執行數千個foreach循環的程序 - 每個循環是否通過調用GetEnumerator在堆上分配一個臨時對象? CLR是否執行任何類型的優化(例如, IEnumerator對象的堆棧分配)? 或者這根本不是一個甚至不用擔心的重要問題?

在大多數情況下,這根本不足以擔心。 正如埃里克指出的那樣,在某些情況下這可能很重要,但根據我的經驗,這些情況相當少。

如果你正在做成千上萬的foreach循環,大概是你在這些循環中做實際的工作 這幾乎可以肯定將遠遠超過迭代器本身更重要。

請注意,在數組上使用foreach (在編譯時稱為數組),無論如何都不使用IEnumerable<T> - 它使用直接索引。 我不會基於此更改我的代碼。

與以往一樣,如果您關注性能,則需要對其進行測量並對其進行分析。 瓶頸幾乎從未像你期望的那樣。

編譯器通常可以將foreach循環優化為一個簡單的循環,這只需要堆棧(或處理器寄存器)中的索引變量。

如果仍然使用迭代器,它們中的大多數都是結構,因此它們只是在堆棧而不是堆上分配。

幾個類的迭代器仍然很小而且速度很快。 您可以創建數百萬個而不會產生明顯的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM