数组或迭代器——对于返回一/两个元素的调用具有更好的性能特征(内存方面)

本文关键字:调用 元素 方面 更好 特征 性能 两个 内存 于返回 迭代器 返回 | 更新日期: 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迭代器,因为我想养成在数组之前使用迭代器的习惯,因为迭代器往往具有更好的性能特征,而且我想鼓励其他人也养成同样的习惯。

数组占用更少的内存和周期,但如果你想对返回的数据进行操作,你会希望使用迭代器,因为迭代器实现了最好的算法,最终会加快速度。