C# Heppard
1.56K subscribers
74 photos
2 files
122 links
25 способов эффективно использовать .NET

Поддержать канал можно тут: https://sponsr.ru/sharp_heppard
Download Telegram
Давайте рассказывать про ЗП #деньги

Я люблю писать и беседовать про деньги, но это почему-то не всегда приветствуется. Тем не менее, я считаю, что это важно. Это позволяет коллегам знать о том, что они чего-то стоят.

Недавно получил подтверждение, что наши компании способны давать весьма конкурентную зарплату. Я имел удовольствие сравнивать предложение компании из Силиконовой долины и нашего аналога IKEA. Батл вышел великолепный, но, на удивление, равный.

Из США предлагали древнее легаси на C#, полное отсутствие микросервисов и всяких модных шутк, но за очень приличные деньги.

Наши давали архитектора, без возможности программировать, но за бОльше деньги. Микросервисы, нормальные технологии, полный фарш. Из минусов - зарплата формируется из оклад + премия. В принципе, это нормальная практика.

Почему я это пишу? Я сторонник открытых цифр по зарплате, так как это помогает нам (работникам) понимать, а, собственно, сколько мы стоим. И, надеюсь, это позволит всем нам не соглашаться на полумеры.
👍3
В преддверии мероприятия, я рекомендую ознакомиться с интересными статьями: почему не нужно использовать MediatR (статья на русском тут) и почему его использовать круто.

Вообще, к MediatR у меня много претензий, в том числе по перформансу. Если вы пойдёте по ссылке, я замечу, что эта библиотека не рекомендуемая для работы в проде.

Ещё немного бенчмарков по MediatR можно найти тут. Детальный рассказ по перформансу тут.

#архитектура #решение #скорость #память
High-performance design patterns #лекция #скорость #память

Один парень из Польши пишет тут свой блог про перформанс. Рекомендую начать знакомство с ним с этого видео, а уже потом переходить к его известной книге.

Каждый раз, когда я рассказываю про подробных людей, меня немного мучает совесть. Мол, ну и так все знают. А нет, практика показывает, что многие не знают.
Андрей Акиньшин #скорость #память

Ещё одного парня рекомендуют. Автор мема "Зависит!" в плане микро-бенчмаркинга. Ну, типа, всё зависит от среды исполнения. А-то мы не знали.

Собственно, Андрей - один из авторов Benchmark.NET. Парень не выдержал особенности GC, нового JIT и сильно ударился в статистику. И Huawai. Очень рекомендую ранние выступления и книгу.

Ну и выступление Андрея про микрооптимизации всё ещё актуальное, поскольку даёт общие подходы, а не готовые решения. Больше готовых решений можно найти в очень старом выступлении вот тут.
👍1
Марк Симан #архитектура

Хочу рассказать про одного датчанина, имя которого я никак не могу запомнить, но, при этом, отлично помню его фото в блоге. Вы можете знать его по AutoFixture - он является одним из авторов.

Кроме того, мужчина весьма много пишет: про тесты, проблемы DI и о программирование вообще. Много книг. Знакомство рекомендую начать вот с этого видео. В принципе, все его статьи примерно такие - много теории, чуть-чуть практики, много тем для размышления.
👍3
Графика HTMLCanvas #графика #скорость

Рекомендую хорошую статью про Rust, SIMD, WebAssembly и GPU. Разницу в подходах можно пощупать онлайн. В принципе, вывод очевиден - использовать GPU при работе с графикой сильно выгоднее. Однако путь автора и попытки добиться высокой производительности без GPU потрясают.

Эта статья (вернее, её первая часть) стала для меня важным мостиком в мир Rust и WebAssembly. До этого я не очень представлял, как вообще всё это заставить работать вместе.
Скрипты в .NET #решение

Однажды я искал библиотеку, чтобы писать скриптики на JS и работать с ними из .NET. Ну знаете, достать из БД логику, которую написал заказчик без участия программиста, на лету изменить поведение приложения, розовые пони... эх, мечты-мечты.

Но библиотеку я запомнил. Поэтому, могу рекомендовать познакомиться с ней тем, кто ещё хочкт прикрутить скриптики на JS. Бенчмарки неплохие, парни из RavenDB и Orchard используют.
👍1
Как работает память #память

Читаю тут текст для настоящих мужиков. Это про то, как "организована память" в .NET. До этого были догадки, были комментарии от создателей, но не было какого-то обобщающего документа от MS.

Вчитываясь в текст, я всё отчётливее понимаю: теперь на собеседованиях можно отвечать "зависит", когда меня попросят реализовать паттерн Singleton. Ведь атомарность действий зависит от платформы.

Узнал про это из подкаста Radio Dotnet. В этом выпуске около часа рассказывают про оптимизации в .NET 7. Очень занимательно.
👍1
Тинькофф написал статью про последние митапы про .NET. Я там тоже есть, но в данном случае хочу порекомендовать вот это (про оптимизации компилятора, осторожно - много IL). И вот это (про lock-free, но на самом деле про обычные concurrent-коллекции).

Руслана (про боль и микросервисы) с Николаем (проектная документация) тоже порекомендую. Их доклады не совсем по теме канала, но они клёвые.

#статья
👍4
PostgreSQL vs MongoDB #хранилище #лекция #решение

Рекомендую достаточно старое видео на тему PostgreSQL vs MongoDB. Недавно пересматривал из-за необходимости выбора. Остановился на PG. Сразу после этого видео рекомендую второе. Оно в тему.

Во втором видео есть интересное объяснение того, что такое highload (high-volume). По версии "человека с лицом индейца" (его зовут Олег Бартунов, если что), это "ситуация в системе, грозящая отказом в обслуживании из-за недостатка ресурсов". Там же про ошибки проектирования. Напомню, что "проектированием" иногда называют само программирование. То есть ваша логика должна быть заточена на highload.
🔥2👍1
Dapper #решение #хранилище

Я сомневаюсь, что сидящие тут люди не знают про то, что такое Dapper. Но иногда меня очень просят рассказать о том, через что достигается максимальная производительность.

Так вот, Dapper. Это просто data-mapper. Собственно, именно то, что вам нужно иметь для получения ответа от DB. Он тупо создаёт объектное представление из данных, которые возвращает в БД. Запрос вы пишете сами. Прям в коде, да. В 60% случаев вам нужно именно это.

Да, у него нет контекста (см. Entity Framework), да, SQL вам нужно писать самим (на самом деле нет и нет). Но возможность писать оконную функцию без бубна, возможность писать взаимодействие с JSONB, возможность бежать по view, возможность использовать поиск, dirty read... Ну это многого стоит.

Да, нужно изучить SQL (уровень программистов в команде должен быть выше), но это именно тот путь, через который вам доступна максимальная производительность.
👍5
Честный TechEmpower #бенч #статья

Мужчина очень хорошо рассказал на тему качества бенчмарка Web Framework Benchmarks от TechEmpower.

В принципе, было очевидно, что циферки натягивают на бенчмарк - такой маркетинговый повод! С другой стороны, разработчики продемонстрировали возможности платформы .NET по микрооптимизации, что меня очень радует.

Также, меня радует, что тест уровня Core MVC + EF + PG (самый плохой тест) с моей точки зрения показывает хороший результат - 184k запросов в секунду. Да, это не топ. Да, эту цифру нужно уменьшить до 18-20k за счёт дополнительных слоёв проверок, абстракций типа Mediator и всего прочего.

Но это 20k запросов в секунду. Которые, при желании, можно превратить в 184k или даже в результат синтетического теста (400k+ запросов). Было бы желание.
👍3
Хороший GUID #хранилище #решение #статья

Недавно вдумчиво читал статью про медленную работу Guid.NewGuid() на некоторых версиях Linux. Интересно, что про подобное я уже слышал на Radio Dotnet, но в контексте создания GUID, основанных на времени (это помогает, например, забирать сущности из БД по одной страничке для UI).

Короче, суть в том, что на некоторых версиях Linux генерация GUID идёт с помощью чуть более медленного алгоритма, чем на Windows. Если у вас именно такая ситуация, то рассмотрите вопрос перехода на другую версию Linux, либо воспользуйтесь предложениями перехода на другие алгоритмы из этой же статьи.

И обязательно посмотрите на рассуждения Эндрю Лока о монотонно возрастающих GUID . Их использование потенциально способно решить проблему фрагментации индекса в MSSQL (увеличение времени вставки, поиска по ID из-за разреженности индекса и рост размера БД). Говорят, что PostgreSQL таким не страдает, но не мешает проверить. Готовое решение для создания монотонно возрастающих GUID называется NewId.

Подробно про это всё написали вот тут.
👍7
Решил на выходных развлечься: протестировал работу клиентов для S3. Выпил чаю, развернул Minio в Docker'e, и обработал его вполне типичными запросами из различных клиентов.

Что конкретно я сделал:
1. Проверил наличие bucket'a.
2. Поместил в хранилище файлик на 125 МБ.
3. Посмотрел, что файлик есть.
4. Скачал его.
5. Удалил.

В принципе, все клиенты справляются быстро, до 2 секунд. Но есть нюанс по памяти: с моей точки зрения, клиенты от Amazon и Minio кушают слишком много. А ведь я ничего особенного не сделал.

Из ощущений по использованию. AWS клиент многословный, трудный. Клиент от Minio лучше, но нас лишили Multipart-загрузки (включается автоматически, при файле больше 5 МБ). Клиент для Yandex - суровое поделие JS-разработчиков. Вроде контракт приятный, но стоит копнуть глубже - мрак, сразу мимо.

Короче говоря, посмотрел я код и... решил написать сам. Результаты на .NET 7 следующие: скорость почти как у Minio, а памяти ем почти 200 раз меньше. Код посмотреть тут.

#хранилище #бенч
👍13🔥2
Без какой-либо цели тестировал аллокацию. Дано: приложение с выставленным gRPC контрактом + Dapper + PostgreSQL. По gRPC приходит запрос (проверка наличия элемента), сходили в БД, в ответочку вернули false. И так миллион раз.

Всё. Какой же результат мы видим по аллокациям?

Правильно, я забыл про Serilog (пишу в консоль). Именно он бешено аллоцирует строчечки. Его аллокации на первом месте. Приятная новость в том, что все они в Gen0. Неприятная новость: раз в 10 секунд GC вынужден вычищать по 300Мб памяти.

#скорость #память #анализ
Как же я забрасывал сервис миллионом запросов (см. предыдущее сообщение)? Ну, не миллионом, положим, но их было много. Просто запустил benchmark. Кстати, в качестве обёртки для gRPC использую protobuf-net.

Аллокация в норме, время выполнения чаще всего быстрее (просто на другой стороне был профайлер по памяти - это немного тормозило ответы).

Вообще, скорость меня впечатлила - мы сериализовали сообщение (пусть и простое), сходили по сети, десериализовали на той стороне, сходили в БД, где тоже сериализовали и десериализовали. Потом сериализовали снова, вернули и десериализовали. Ух... И всё это за 1-2 мс. Круто.

#скорость #бенч
👍3
Комментарии есть?