gpt4 book ai didi

c# - Span 可以提高哪些常见操作的效率?

转载 作者:太空狗 更新时间:2023-10-29 23:28:46 31 4
gpt4 key购买 nike

假设我有一个 Web 应用程序,我想使用新的 Span<T>类型以降低 GC 压力并提高性能。

我应该注意哪些模式? .NET 团队在实现此新功能时是否考虑过任何典型操作?

最佳答案

在很多情况下,这个新类和基础架构可以提供帮助,但它们是否常见取决于您的代码...

例如,请参阅此 C# 7.2 之前的实现:

static void Main(string[] args)
{
byte[] file = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
byte[] header = file.Take(4).ToArray();
byte[] content = file.Skip(4).ToArray();

bool isValid = IsValidHeader(header);
}

private static bool IsValidHeader(byte[] header)
{
return header[0] == 0 && header[1] == 1;
}

file.Take(4).ToArray()byte[] content = file.Skip(4).ToArray();这里的问题是:我们必须创建一个新数组来拆分字节数组的两个部分。当字节数组的大小变大时,您可以想象对性能和内存使用的影响(想象一个 10 MB file 数组,突然占用 20 MB 内存)。

现在查看 C# 7.2 实现:

static void Main(string[] args)
{
byte[] file = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
var header = file.Take(4);
var content = file.Skip(4);

bool isValid = IsValidHeader(header);
}

private static bool IsValidHeader(ReadOnlySpan<byte> header)
{
return header[0] == 0 && header[1] == 1;
}

使用 ReadOnlySpan<T> (Span<T> 基础设施的一部分)在这里可以使用数组中的数据,无需复制它!内存压力还是10MB。数组不重复。由于数组、列表和流读取器都使用 Span<T> ,您可以为所有来源构建一个通用方法。

当然,这可以用 IEnumerable<T> 实现也一样,但这种性能要好得多(例如,如果您重复使用 content 变量,则不会无休止地跳过)。

关于c# - Span<T> 可以提高哪些常见操作的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329946/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com