Эта конструкция C# ускорила программу вдвое. Ref struct Span

preview_player
Показать описание
Доброго времени суток тебе, странник! Добро пожаловать в Dev Jungles Stories!

Компьютеры развиваются, а приложения все тормозят. Часто это потому, что разработчикам не хватает квалификации заточить свое приложение так, что бы оно работало достаточно быстро.
В этом случае на помощь приходят профилировщики в целом и dotTrace в частности.

Разбирать буду на примере тестового задания, что прислали моему другу какое-то время назад. Задание не очень сложное, но моментов для оптимизации интересных много, тем более что от него этого ожидали.
А покажу я вам конструкцию C#, которая ускорила программу вдвое. Ref struct Span
Что ж, не будем долго тянуть, вперед!
Полная версия тут:

Поддержать канал можно:
- Спонсорством на YouTube
- Переводом на карту или пополнением банки монобанка:
Dev Jungles YouTube Channel Fund

Номер карты банки:
5375 4112 0230 1466

- Или криптой:
Binance Id: 479881646

BTC - 18C3jsFYwviN5FvzpAt4uMWRfUeVKvdWxy
ETH - 0x2903f63ba9009732272e91a299053b9d7b623216

USDT on ERC20 - 0x2903f63ba9009732272e91a299053b9d7b623216
USDT on TRC20 - TSmS5RzQKbWdxZkoM2oRo9HK8FYBaq744T

LTC - LN3CkrnvZLZTXDUhqTy1gUKMVpLjEPA4G2

DOGE - DPwon439jf3axVSBwyuXso6z7CivuJF655
AAVE - 0x2903f63ba9009732272e91a299053b9d7b623216
Waves - 3P8D57Zw7CrqW2o7dHpvZR2UzAzQRFA2kZd

Тайм-коды:
00:00 - Тизер
00:30 - Сортировка файлов и оптимизация конструктора класса Line
01:32 - Сплит
02:50 - Избавляемся от substring. Метод AsSpan
08:38 - Наставления по отчету оптимизации в два раза
14:14 - read-only ref struct

{"parent": "B9v7pdfhUYw"}
Рекомендации по теме
Комментарии
Автор

а не пробовал заменить IndexOf и Substring на Split? какой будет результат?

OlegNN
Автор

Как давно я ждала здесь короткого формата! Спасибо, очень ёмко и полезно!

maryiaklimkovich
Автор

Ось для чого треба писати тести. На 7:15 зміна методу Build приводить до зміни функціоналу. Так як Number має публічний геттер, стара версія дозволяла його поміняти і отримати нову/іншу строку через Build. Нова прискорена версія завжди буде повертити строку з конструктора.
Якщо ж залишити старий функціонал - програма буде працювати повільніше, тому що створюватиметься нова строка + буде аллокаія памяті під неї.

andriiyustyk
Автор

Большое спасибо за подробное объяснение! У Троелсона написано, что они есть, написано, где их низя. А вот такого практического примера нет. Еще раз спасибо. Мира нам всем!

igorpom
Автор

Опознал в коде тестовое задание от своего работодателя. А чего пишу - хотел заметить, что если писать на .NET Core 2+, то там действительно оптимизировали производительность, а вот для .NET Framework Span - это всего лишь сахар для работы со слайсами, там никакого особо ускорения производительности у меня не случалось.

И ещё один интересный момент подмечен. Пишешь библиотечную функцию для работы со строками - обязательно пиши перегрузку для того чтобы можно было передать Span. Потом кто-то скажет спасибо :-)

anikss
Автор

Случайно наткнулся на это видео и прям до конца сидел смотрел)

loam
Автор

С вашего позволения (на самом деле вне зависимости от разрешения) буду пиарить ваш канал среди знакомых

nikitabukov
Автор

Во, сам в критичных моментах прибегаю к ref struct и span. Лайк за Guns N' Roses!

skope
Автор

Спасибо за такие интересные вещи
Для меня как для джуна некоторые моменты сложны, но твои видео помогают лучше понимать что, зачем и как

НикитаПлетнев-жу
Автор

Я же правильно понимаю что если нам требуется просто не алоцируемая строка то можно передавать её как "Foo(in string value) => ..." ? или всё таки лучше даже для целой строки использовать ReadOnlySpan ?

Hafune