【问题标题】:Does IEnumerators require more resources than Arrays?IEnumerators 是否需要比数组更多的资源?
【发布时间】:2013-04-29 13:05:21
【问题描述】:

我有一个 Sutherland–Hodgman 算法的实现,所以我需要经常返回数组。我正在使用 Unity,因此答案至少需要适用于 Mono 运行时。

我想知道是否最好返回普通数组,或者我是否可以作为 IEnumerator 返回,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的很想放弃对 GC.Collect() 的调用。

我猜垃圾收集器也需要收集 IEnumerators,并且可能还有一些相关的开销?

【问题讨论】:

  • 我认为您的意思是IEnumerables(通用或其他)。而且大多数都是托管集合,是的,通常会比数组产生一些内存开销(当然,也需要收集)。
  • 您在哪里或为什么要调用 GC.Collect()?一般来说,这几乎是不可取的。如果您在游戏循环中运行该算法,您应该真正重用您的集合,无论它是数组还是其他东西,否则分配/解除分配可能会占用大量性能。跨度>
  • 我真的认为我的意思是 IEnumerator。不管它是什么,我的意思不是一些实现 IEnumerable 的集合,而是一个执行多个返回的函数。
  • 我没有调用 GC.Collect(),但只要收集器需要,它就会被调用。我无法完全控制它何时被调用。
  • 你说的是 Unity 游戏引擎还是 Unity IoC 容器?

标签: c# arrays mono unity3d ienumerator


【解决方案1】:

当使用生成器协程(具有许多 yield returns 的函数)时,不会创建或分配数组。一切都以流媒体方式完成。完全有可能拥有无限的生成器而不会出现内存不足错误:

public static IEnumerable<int> Odds(){
  for (int i = 1 ; ; i += 2)
    yield return i;
}

因此,如果您经常返回大数组并立即进行迭代和处理,那么好处将是巨大的,因为内存分配会小得多。垃圾收集器的调用频率会降低,工作量也会减少。

【讨论】:

  • 谢谢!这就是我正在调查的。知道引入了多少开销吗?
  • 清理所有枚举器类怎么样?
  • @Steinbitglis:理论上,它不会引入比数组更多的开销。您分配并返回一个 IEnumerator,而不是分配和返回一个数组。两者的开销相当,因为分配只发生在第一次收益回报上。
  • @MartinMulder:当然,您可以在一个巨大的函数中编写所有代码以避免所有清理工作,但那会是一团糟。
【解决方案2】:

首先,只需创建您的大数组并将其保存在内存中的某个位置。应用程序的其余部分可以检索对该数组的引用并遍历它。

遍历数组的最佳方式和最快方式是使用for

如果您使用foreach,则每次(在水下)都会创建一个枚举器类,在它完成任务后需要对其进行清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2015-11-18
    • 2014-06-02
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多