TGViewer
yet another dev yet another dev @yet_another_dev · 382 subscribers
Post #137 373
Сравнение string и Span: поиск символов и подстрок

Публикую первую часть результатов сравнения методов string и Span. Начнём с методов для поиска символов и подстрок. Замеры проводились на массиве из 100 000 строк. Я постарался скомпоновать данные в виде диаграмм, но поскольку я сравнивал перегрузки с различными значениями StringComparison, то данных получилось очень много. Сырые результаты и бенчмарки можно найти здесь. Основные выводы, которые можно сделать на основе полученных данных ниже.

Contains

🟢Методы string.Contains(char value), string.Contains(string value), ReadOnlySpan<char>(char value) работают одинаково быстро.

🟢Методы Contains(char value, StringComparison comparisonType) и Contains(string value, StringComparison comparisonType) работают быстро при использовании Ordinal, OrdinalIgnoreCase, InvariantCulture и InvariantCultureIgnoreCase.

🟠Использование CurrentCulture и CurrentCultureIgnoreCase медленее в 250 – 330 раз.

StartsWith

🟢Методы StartsWith(string value, StringComparison comparisonType) работают быстро при использовании Ordinal, OrdinalIgnoreCase, InvariantCulture и InvariantCultureIgnoreCase.

🟠Использование CurrentCulture и CurrentCultureIgnoreCase медленее примерно в 100 раз.

🟠Метод string.StartsWith(string value) под капотом использует перегрузку с параметром CurrentCulture.

EndsWith

🟢Методы EndsWith(string value, StringComparison comparisonType) работают быстро при использовании Ordinal, OrdinalIgnoreCase, InvariantCulture и InvariantCultureIgnoreCase.

🟠Использование CurrentCulture и CurrentCultureIgnoreCase медленее примерно в 100 раз.

🟠Метод string.EndsWith(string value) под капотом использует перегрузку с параметром CurrentCulture.

IndexOf

🟢Метод IndexOf(char value) работает одинаково быстро как в string, так и в Span.

🟢Метод IndexOf(string value) работает быстро только в ReadOnlySpan.

🟢Методы IndexOf(char value, StringComparison comparisonType) и IndexOf(string value, StringComparison comparisonType) работают быстро при использовании Ordinal, OrdinalIgnoreCase, InvariantCulture и InvariantCultureIgnoreCase.

🟠Использование CurrentCulture и CurrentCultureIgnoreCase медленее примерно в 260 раз.

🟠Метод string.IndexOf(string value) под капотом использует перегрузку с параметром CurrentCulture.

LastIndexOf

🟢Метод LastIndexOf(char value) работает одинаково быстро как в string, так и в Span.

🟢Методы LastIndexOf(char value, StringComparison comparisonType) и LastIndexOf(string value, StringComparison comparisonType) работают быстро при использовании Ordinal, OrdinalIgnoreCase, InvariantCulture и InvariantCultureIgnoreCase.

🟠Использование CurrentCulture и CurrentCultureIgnoreCase медленее примерно в 260-370 раз.

🟠string.LastIndexOf(string value) под капотом этот метод использует перегрузку с параметром CurrentCulture.

IndexOfAny и LastIndexOfAny

🟢Все методы работают одинаково быстро.
  • 👍 12
More from @yet_another_dev
  1. Sep 21, 2026Опубликовал вчера ролик в одной запрещённой в России соцсети про то, как сходил на выборы.…
  2. Sep 20, 2026Мы пришли в 7:50 и очередь уже была 🥲 Пообщались с другими людьми. Многие приехали из дру…
  3. Sep 19, 2026Post #383
  4. Sep 18, 2026Последние пару недель на чат нападают боты со спамом (прикрыл стикером). Поэтому чат тепер…
  5. Sep 17, 2026Что интересного в этой статье: 1. Потрачено $120К, а агенты суммарно отработали около 3-х…
  6. Sep 17, 2026В Microsoft переписали рантайм GitHub Copilot с TypeScript на Rust при помощи агентов. Под…
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 →