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

Ton*_*ony 6 c# optimization performance ienumerable iterator

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

Jon*_*eet 14

在大多数情况下,这根本不足以担心.正如埃里克指出的那样,在某些情况下这可能很重要,但根据我的经验,这些情况相当少.

如果你正在做成千上万的foreach循环,大概是你在这些循环中做实际的工作.这几乎肯定会远远超过迭代器本身更重要.

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

与以往一样,如果您关注性能,则需要对其进行测量并对其进行分析.瓶颈几乎从未像你期望的那样.

  • 虽然这是一如既往的优秀建议Jon,但我们的性能测试确实显示了在一些真实场景中迭代器的堆分配/垃圾收集对性能的显着影响.这就是List <T>的枚举器是一个邪恶的可变值类型而不是引用类型的原因.但当然关键词是"我们的性能测试" - 正如您所指出的那样,在没有数据的情况下做出性能决策是愚蠢的. (14认同)
  • 是的,邪恶的可变`List <T>`迭代器 - 我似乎记得一篇新闻组帖子看起来像一段合理的代码,但由于设计决定而给出了一些非常奇怪的结果:)我将编辑无论如何都要回答......"它不重要"的一揽子主张很少是一个好主意. (2认同)