Kir*_*man 5 c# c#-7.2 system.memory
假设我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
和是这里的问题:我们必须创建一个新数组来分割字节数组的两部分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;
}
Run Code Online (Sandbox Code Playgroud)
在这里使用ReadOnlySpan<T>(基础设施的一部分Span<T>)可以使用数组中的数据,而无需重复它!内存压力依然是10MB。该数组不重复。由于数组、列表和流读取器都使用Span<T>,因此您可以为所有源构建一种通用方法。
当然,这也可以实现IEnumerable<T>,但这种性能要好得多(例如,如果您content重复使用该变量,则不会无休止的跳过)。
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |