C# IEnumerator比数组需要更多的资源吗?
我有一个Sutherland–Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时 我想知道是否最好返回普通数组,或者是否可以作为IEnumerator返回,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的希望释放对GC.Collect()的调用C# IEnumerator比数组需要更多的资源吗?,c#,arrays,mono,unity3d,ienumerator,C#,Arrays,Mono,Unity3d,Ienumerator,我有一个Sutherland–Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时 我想知道是否最好返回普通数组,或者是否可以作为IEnumerator返回,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的希望释放对GC.Collect()的调用 我猜垃圾收集器也需要收集IEnumerator,并且可能还有一些相关的开销?当使用生成器共同例程(具有许多产生返回的函数)时,不会创建或分配数组。一切都是以流式方式完成的。完全有可
我猜垃圾收集器也需要收集IEnumerator,并且可能还有一些相关的开销?当使用生成器共同例程(具有许多
产生返回的函数)时,不会创建或分配数组。一切都是以流式方式完成的。完全有可能有无限多个生成器在不出现内存不足错误的情况下工作:
public static IEnumerable<int> Odds(){
for (int i = 1 ; ; i += 2)
yield return i;
}
公共静态IEnumerable赔率(){
对于(int i=1;i+=2)
收益率i;
}
因此,如果您经常返回大数组,而这些数组只是为了立即迭代和处理,那么好处将是巨大的,因为内存分配将小得多。垃圾回收器的调用频率会降低,所做的工作也会减少。当使用generator联合例程(具有多个产生返回的函数)时,不会创建或分配任何数组。一切都是以流式方式完成的。完全有可能有无限多个生成器在不出现内存不足错误的情况下工作:
public static IEnumerable<int> Odds(){
for (int i = 1 ; ; i += 2)
yield return i;
}
公共静态IEnumerable赔率(){
对于(int i=1;i+=2)
收益率i;
}
因此,如果您经常返回大数组,而这些数组只是为了立即迭代和处理,那么好处将是巨大的,因为内存分配将小得多。垃圾收集器被调用的次数会减少,需要做的工作也会减少。首先,创建大数组并将其保存在内存中的某个位置。应用程序的其余部分可以检索对该数组的引用,并通过该数组进行引用
通过数组执行数据传输的最佳方式和最快速度是使用for
如果您使用的是foreach
,则每次(在水下)创建枚举器类时,都需要在完成其职责后对其进行清理。首先,只需创建大数组并将其保存在内存中的某个位置。应用程序的其余部分可以检索对该数组的引用,并通过该数组进行引用
通过数组执行数据传输的最佳方式和最快速度是使用for
如果您使用的是foreach
,则每次(在水下)都会创建一个枚举器类,在完成其职责后需要对其进行清理。我想您的意思是IEnumerable
s(泛型或其他)。大多数情况下,这些都是托管集合,是的,通常会比数组有一些内存开销(当然,也需要被收集)?一般来说,这几乎是不可取的。如果你在游戏循环中运行该算法,你应该真正重用你的集合,不管它是数组还是其他什么,否则分配/释放很可能是一个巨大的性能消耗。我真的认为我指的是IEnumerator。不管它是什么,我不是指实现IEnumerable的某个集合,而是指执行多个返回的函数。我不是调用GC.Collect(),而是在收集器需要时调用它。我不能完全控制它的调用时间。你是说Unity游戏引擎还是Unity IoC容器?我想你指的是IEnumerable
s(通用或其他)。大多数情况下,这些都是托管集合,是的,通常会比数组有一些内存开销(当然,也需要被收集)?一般来说,这几乎是不可取的。如果你在游戏循环中运行该算法,你应该真正重用你的集合,不管它是数组还是其他什么,否则分配/释放很可能是一个巨大的性能消耗。我真的认为我指的是IEnumerator。不管它是什么,我不是指实现IEnumerable的某个集合,而是指执行多个返回的函数。我不是调用GC.Collect(),而是在收集器需要时调用它。我不能完全控制它的调用时间。你是说Unity游戏引擎还是Unity IoC容器?谢谢!这就是我正在调查的。知道引入了多少开销吗?清理所有枚举器类怎么样?@Steinbitglis:理论上,它不会引入比数组更多的开销。分配并返回IEnumerator,而不是分配并返回数组。两者的开销是相当的,因为分配只发生在第一次收益回报上。@MartinMulder:当然,为了避免所有的清理,你可以在一个巨大的函数中编写所有的代码,但那将是多么的混乱。谢谢!这就是我正在调查的。知道引入了多少开销吗?清理所有枚举器类怎么样?@Steinbitglis:理论上,它不会引入比数组更多的开销。分配并返回IEnumerator,而不是分配并返回数组。两者的开销是相当的,因为分配只发生在第一次收益回报上。@MartinMulder:当然,为了避免所有的清理,你可以在一个巨大的函数中编写所有的代码,但那将是多么的混乱。