TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #1569 1.57K
День 1265. #ЗаметкиНаПолях
Используем Span Для Производительности. Окончание
Начало

Используем ReadOnlySpan вместо строки
Рассмотрим пример, где нам нужно разобрать строку построчно:
public int ParseWithString()
{
var prev = 0;
var curr = 0;
var rows = 0;
foreach (char c in _text)
{
if (c == '\n')
{
curr += 1;
var line = _text[prev..curr];
if (line.Equals(Environment.NewLine))
rows++;
prev = curr;
continue;
}
curr++;
}

return rows;
}

В первом примере мы используем строки. Мы пытаемся определить, сколько пустых строк в нашем файле. Текст хранится в строковой переменной _text. Мы перебираем каждый символ строке, если находим символ новой строки, с помощью Substring() проверяем предыдущую строку. Если эта строка пустая, увеличиваем счётчик. Ключевым моментом здесь является то, что Substring() создаёт строку в куче. Сборщику мусора потребуется время, чтобы уничтожить эти строки.

Теперь тот же процесс с использованием Span:
public int ParseWithSpan()
{
var textSpan = _text.AsSpan();
var prev = 0;
var curr = 0;
var rows = 0;
foreach (char c in textSpan)
{
if (c == '\n')
{
curr += 1;
var slice = textSpan[prev..curr];
if (slice.Equals(Environment.NewLine, StringComparison.OrdinalIgnoreCase))
rows++;
prev = curr;
continue;
}
curr++;
}

return rows;
}
Здесь процесс такой же, за исключением того, что мы не создаем дополнительные строки. Мы преобразуем текстовую строку в ReadOnlySpan, вызывая метод AsSpan(). Кроме того, вместо Substring() мы используем метод Slice, который создаёт ReadOnlySpan, представляющий подстроку. В этом случае в куче ничего не выделяется.

Вспомним, что сборка мусора напрямую влияет на производительность приложения. Используя ReadOnlySpan вместо строк везде, где возможно, мы можем сильно повысить производительность приложения. ReadOnlySpan поддерживает множество функций, знакомых по работе со строками: Contains(), EndsWith(), StartsWith(), IndexOf(), LastIndexOf(), ToString(), Trim() и т.п.

Тестирование
Оценим результаты теста производительности двух примеров выше:
ParseWithSpan - 23.55 us, без аллокаций.
ParseWithString - 36.12 us, аллоцировано 70,192 B

Результаты ожидаемы. Span работает быстрее и не выделяет дополнительной памяти (но см. ограничения в предыдущем посте).

Итого
Использование Span повышает производительность. Важно отметить, что команда разработчиков .NET активно использует Span во внутренних библиотеках и максимально упрощает их использование для разработчиков. Команда .NET уже имеет поддержку Span<T> для DateTime, TimeSpan, Int32, GUID, StringBuilder, System.Random и многих других типов. Важно понимать, как использовать Span, потому что они будут больше и больше присутствовать в будущем коде .NET и в некоторых случаях могут стать стандартом.

Источник: https://code-maze.com/csharp-span-to-improve-application-performance/
  • 👍 10
More from @netdeveloperdiary
  1. Oct 14, 2026Post #3373
  2. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 1. Почему существу…
  3. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  4. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  6. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →