Span ‹T› - это новый тип, который будет доступен в .NET Core 2.1.
Чтобы упростить его, вы можете представить его как массив типов значений
, который можно разрезать на подблок без выделения памяти.
В следующем разделе я хотел бы представить несколько тестов и примеров кода.
В тесте сравнивается производительность нарезки массива с использованием:
- Копирование массива
- Span ‹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, чтобы получить на него ссылку.
- Он не может быть размещен в куче,
поэтому не может быть членом класса. - Он может быть членом ref struct.
- Он отлично подходит, когда вам нужно выполнить манипуляции со строкой, например SubString
, например:
«AbCD» .AsSpan () возвращает ReadOnlySpan ‹char›
- - - - - - - - - - - - - - - - - - - - - -
это означает, что вы можете использовать «ABCD» .AsSpan (). Slice (2,1)
вместо «ABCD» .Substring (2,1).
Вы можете подробнее об этом прочитать в статье Стивена Тауба.