Чем новый C# Span отличается от ArraySegment?
У меня возникли проблемы с концептуализацией использования Нового Span в C#.
Какую конструкцию(конструкции) она заменяет? Является ли ArraySegment теперь устаревшим?
Какую функциональность она включает, чего раньше не было?
Является ли Span допустимой заменой массивов C#? В каких случаях-да, в каких-нет?
Когда я буду использовать ArraySegment вместо Span?
Я пытаюсь понять, как мои стили кодирования необходимо будет изменить, чтобы эффективно использовать новый пролет.
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