Span‹T› е нов тип, който ще бъде наличен в .NET Core 2.1.
За да го опростите, можете да го разглеждате като масив от тип стойност
, който може да бъде разделенна подединица без разпределяне на памет.
В следващия раздел бих искал да представя няколко сравнителни тестаи примерни кодове.
Бенчмаркът сравнява производителността на нарязания масив с помощта на:
- Копиране на масив
- Размах‹T›
- небезопасен указател
Бенчмарковете, налични в GitHub (той използва BenchmarkDotNet).
Всички бенчмаркове използват следния масив:
public int[] Data = Enumerable.Range(0, 10_000_000).ToArray();
Използването на класическата манипулация на масива е:
Span‹T› използва:
Указателят използва:
Резултатите бяха:
Method |Mean |Scaled |Rank |Allocated | ------- |------------:|------:|------:|----------:| Array | 4,966.5 us | 1.00 | 3 | 4032 B | Span | 162.9 us | 0.03 | 1 | 0 B | Pointer | 175.3 us | 0.04 | 2 | 0 B |
Някои интересни факти за Span‹T›:
- Добавете System.Memory NuGet, за да получите препратка към него.
- Той не можеда бъде разпределен вHeap,
следователно не може да бъде член на клас. - Той може да бъде член на реф структура.
- Той блести, когато трябва да извършвате манипулации с низове като SubString
например:
“AbCD”.AsSpan() връща ReadOnlySpan‹char›
— — — — — — — — — — — — — — — — — — — — — —
това означава, че можете да използвате “ABCD”.AsSpan().Slice(2,1)
вместо “ABCD”.Substring(2,1).
Можете да прочетете повече за това в Stephen Toubs Paper.