Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerator比数组需要更多的资源吗?_C#_Arrays_Mono_Unity3d_Ienumerator - Fatal编程技术网

C# IEnumerator比数组需要更多的资源吗?

C# IEnumerator比数组需要更多的资源吗?,c#,arrays,mono,unity3d,ienumerator,C#,Arrays,Mono,Unity3d,Ienumerator,我有一个Sutherland–Hodgman算法的实现,所以我需要经常返回数组。我使用的是Unity,所以答案至少需要应用于Mono运行时 我想知道是否最好返回普通数组,或者是否可以作为IEnumerator返回,以减少垃圾收集之间的时间。到目前为止,我一直在返回数组,但我真的希望释放对GC.Collect()的调用 我猜垃圾收集器也需要收集IEnumerator,并且可能还有一些相关的开销?当使用生成器共同例程(具有许多产生返回的函数)时,不会创建或分配数组。一切都是以流式方式完成的。完全有可

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

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


我猜垃圾收集器也需要收集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:当然,为了避免所有的清理,你可以在一个巨大的函数中编写所有的代码,但那将是多么的混乱。