数组或迭代器——对于返回一/两个元素的调用具有更好的性能特征(内存方面)
本文关键字:调用 元素 方面 更好 特征 性能 两个 内存 于返回 迭代器 返回 | 更新日期: 2023-09-27 18:04:35
假设我们有以下方法(伪c#):
static IEnumerable<T> Iterator<T>()
{
switch (SomeCondition)
{
case CaseA:
yield return default(T);
case CaseB:
yield return default(T);
yield return default(T);
case CaseC:
yield return default(T);
default:
break;
}
}
static IEnumerable<T> Array<T>()
{
switch (SomeCondition)
{
case CaseA:
return new[] { default(T) };
case CaseB:
return new[] { default(T), default(T) };
case CaseC:
return new[] { default(T) };
default:
break;
}
}
如果我们有很多类似的方法调用,哪个会消耗更少的内存(和更少的GC周期)?编写自己的Enumerable/Enumerator来实现这种Enumerable. once()场景有意义吗?
这个比其他两个都快:
static T[] Array<T>()
{
switch (SomeCondition)
{
case CaseA:
return new[1];
case CaseB:
return new[2];
case CaseC:
return new[1];
default:
break;
}
}
这取决于t。例如,大型结构体、字符串或字节数组使用迭代器会做得更好。但一般来说,对于一两个项目,数组可能会更小。
但这没有抓住重点。它之所以更快,是因为问题空间非常小,对性能影响不大:一两个项目序列不太可能成为应用性能的驱动因素。在这种情况下,比起性能,我更担心其他因素,如清晰度、可维护性和创造良好习惯。
其中,你可能会认为数组更清晰或更简洁,因为没有遇到迭代器的程序员仍然可以很容易地理解它。就我个人而言,我更喜欢yield迭代器,因为我想养成在数组之前使用迭代器的习惯,因为迭代器往往具有更好的性能特征,而且我想鼓励其他人也养成同样的习惯。数组占用更少的内存和周期,但如果你想对返回的数据进行操作,你会希望使用迭代器,因为迭代器实现了最好的算法,最终会加快速度。