C#中迭代器的内存使用情况

时间:2009-08-22 11:14:22

标签: c# performance optimization iterator ienumerable

在C#中使用大量迭代器对内存使用有什么影响?假设一个执行数千个foreach循环的程序 - 每个循环是否通过调用GetEnumerator在堆上分配一个临时对象? CLR是否执行任何类型的优化(例如IEnumerator个对象的堆栈分配)?或者这根本不是一个甚至不用担心的重要问题?

2 个答案:

答案 0 :(得分:14)

在大多数情况下,担心这一点并不足够。正如埃里克指出的那样,可能会有一些的案例,这些案例很重要,但根据我的经验,这些案例很少。

如果您正在进行数十万个foreach循环,可能是您在这些循环中正在进行实际的工作。几乎可以肯定,比迭代器本身更重要。

请注意,在数组上使用foreach(在编译时称为数组),无论如何都不使用IEnumerable<T> - 它使用直接索引。我不会基于此更改我的代码。

与以往一样,如果您关注性能,则需要对其进行测量并对其进行分析。瓶颈几乎从未出现在你预期的地方。

答案 1 :(得分:2)

编译器通常可以将foreach循环优化为一个简单的循环,它只需要堆栈(或处理器寄存器)中的索引变量。

如果仍然使用迭代器,它们中的大多数都是结构,所以它们只是在堆栈而不是堆上分配。

作为类的少数迭代器仍然非常小而且快。你可以创造数百万而没有明显的影响。