Чем новый C# Span отличается от ArraySegment?



У меня возникли проблемы с концептуализацией использования Нового Span в C#.





  1. Какую конструкцию(конструкции) она заменяет? Является ли ArraySegment теперь устаревшим?



  2. Какую функциональность она включает, чего раньше не было?



  3. Является ли Span допустимой заменой массивов C#? В каких случаях-да, в каких-нет?



  4. Когда я буду использовать ArraySegment вместо Span?



Я пытаюсь понять, как мои стили кодирования необходимо будет изменить, чтобы эффективно использовать новый пролет.

561   2  

2 ответов:

Span<T> ничего не заменяет. Это добавленная стоимость. Он обеспечивает типобезопасное представление непрерывных сегментов памяти, которые могут быть выделены различными способами: либо в виде управляемого массива, стековой памяти или неуправляемой памяти.

ArraySegment<T> ограничивается управляемыми массивами. Вы не можете использовать его для обертывания данных, выделенных в стеке с помощью stackalloc. Span<T> позволяет вам сделать это.

ArraySegment<T> также не предоставляет доступ только для чтения в базовый массив. ReadOnlySpan<T> дает вам тот.

Span<T> не предполагается заменять массивы. В конце концов, это просто просмотр данных. Эти данные должны быть как-то распределены, и в управляемом мире это распределение, в большинстве случаев, будет распределением массива. Так что вам все еще нужны массивы.

Вы должны использовать Span<T>, если хотите, чтобы ваш код мог манипулировать не только массивами. Например, рассмотрим библиотеку синтаксического анализа. Прямо сейчас, чтобы позволить ему работать с массивами, стеком выделенной памяти и неуправляемой памяти, он должен обеспечьте несколько точек входа в API для каждого из них и используйте небезопасный код для фактического манипулирования данными. Кроме того, вероятно, потребуется предоставить API на основе string для использования людьми, у которых данные распределены в виде строк. С помощью Span и ReadOnlySpan вы можете объединить всю эту логику в одно решение на основе Span, которое будет применимо во всех этих сценариях.

Span<T> это определенно не будет что-то, что используется всеми и очень часто. Это узкоспециализированная часть из .Net не полезно в основном для библиотеки автором и очень высокая производительность критических сценариев. Например, Kestrel, веб-сервис позади ASP.NET ядро получит много преимуществ производительности от перехода к Span<T>, потому что, например, разбор запроса может быть выполнен с использованием Span<T> и выделенной стеком памяти, что не оказывает давления на GC. Но вы, пишущие сайты и сервисы на основе ASP.NET сердечник не обязательно должен использовать его.

FromMSDN Magazine : Span определяется таким образом, что операции могут быть столь же эффективными, как и на массивах: индексирование в span не требует вычислений для определения начала от указателя и его начального смещения, поскольку само поле ref уже инкапсулирует оба. (напротив, ArraySegment имеет отдельное поле смещения, что делает его более дорогим как для индексирования, так и для передачи.)

Также, В то время как массив реализует IEnumerable, Span этого не делает.

Comments

    Ничего не найдено.