繁体   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