Обновить
-2

Пользователь

Отправить сообщение

Бенчмаркая Sum: ускорил циклом — замедлил в ×4,7

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели11K

Уважаемые читатели, в этой статье я хочу рассказать о том, что происходит внутри values.Sum() в современном .NET — там нашлись векторные инструкции, контроль переполнения и список процессоров, которым рантайм намеренно ограничивает ширину вектора, — и представить свои выводы.

В прошлых статьях серии самописные циклы уже проигрывали BCL в поиске по строке, JIT сам выкидывал проверки границ, а foreach прятал аллокации. Тут случай интереснее: values.Sum() — это LINQ, который при оптимизации первым делом меняют на цикл.

Читать далее

Бенчмаркая регресс LINQ: обещали −19%, на четырёх машинах намерил +31%

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели11K

Уважаемые читатели, в этой статье я хочу рассказать о проверке обещанного регресса LINQ в .NET 10 — и представить свои выводы.

В dotnet/runtime с лета висит issue #117717: после перехода на .NET 10 метод с First(предикат) просел к девятке — у автора issue на Intel 13-го поколения до 19%, у Энди Эйерса из JIT-команды на Zen 4 порядка 10%. Причину команда назвала сама: связка PGO и инлайнинга, делегат предиката перестал инлайниться.

Решение тоже озвучили: в десятке чинить не будем — сломаем другое, переносим в .NET 11. Был частичный фикс (PR #117816), после которого issue переоткрыли как #119425. Десятка при этом LTS, и в комментах закономерный вопрос: обновляться на десятку или ждать одиннадцатую.

Читать далее

Бенчмаркая поиск по строке: самописные циклы проигрывают от ×14 до ×154

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели14K

Уважаемые читатели, в этой статье я хочу рассказать про поиск по строке и представить свои выводы. Началось с оптимизации: сравнил поиск символа циклом со string.IndexOf — и получил разницу в разы. Заодно выяснилось, что серверный Xeon с AVX-512 в этой задаче медленнее игрового десктопа с AVX2. Ниже разбор обоих фактов с дизасмом и замерами.

Будет четыре истории, и в каждой — вопрос, на который я искал ответ:

Читать далее

Бенчмаркая проверки границ: фикс, который шёл 8  лет, и проверка, которая жива до сих пор

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.5K

Уважаемые читатели, в этой статье я хочу рассказать о проверках границ массива и представить свои выводы. Каждое обращение arr[i] обязано проверить индекс, иначе IndexOutOfRangeException — а JIT старается эти проверки убирать, когда может доказать, что выход за границы невозможен. Я взял несколько обычных циклов и посмотрел в машинный код на .net 8, 9, 10 и 11 одновременно. Результат разложился по версиям так, как я не ожидал.

Будет три истории:

Читать далее

Бенчмаркая foreach и энумераторы: аллокации, которые прятались 10 лет

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели15K

Уважаемые читатели, в этой статье я хочу рассказать о скрытых аллокациях в обычном foreach и представить свои выводы. Тесты сделаны на .net 8, .net 9 и .net 10 одновременно, чтобы было видно, как одна и та же строчка кода ведет себя на разных рантаймах.

Все тесты сделаны с использованием BenchmarkDotNet, полный код представлен на гите, так что каждый может проверить результаты и сделать свои выводы.

Будет три истории, и все три про foreach:

Читать далее

Plumix: как я переписываю Flutter на C# — вместе с ИИ

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели9K

Я скучал по C#, когда писал на Flutter, и по Flutter — когда писал на C#. Поэтому взял и совместил: Plumix — фреймворк с флаттеровской архитектурой виджетов поверх .NET и Avalonia, который во многом строят ИИ-агенты. Рассказываю про мотивацию, конвейер портирования, текущие фичи и планы.

Смотреть, что получилось

Паттерны доступа к данным, которые выбесят ваш процессор

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели14K

Представим, что у нас есть массив целых чисел. Какой будет самый медленный способ их просуммировать? Будет ли это складывание слева направо, в случайном порядке или как-то иначе? Чтобы ответить на этот вопрос, мы воспользуемся слабыми местами системы управления памятью и с нуля разработаем такой паттерн обращения к данным, по которому сложение будет происходить максимально долго.

Читать далее

Гибель богов. Fable и ещё 10 LLM реорганизуют код. Сравнение

Уровень сложностиСложный
Время на прочтение31 мин
Охват и читатели11K

Это подробный разбор одного эксперимента. Я взял god node из реального LangGraph агента и попросил 5 американских и 6 китайских моделей сначала предложить, как её распутать, а потом оценить предложения друг друга. Дальше тремя разными способами пытался понять, кому из них в этом деле верить.

Читать далее

Как стримить данные в ASP.NET и как их принять

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели6.2K

Недавно мне попалась отличная статья про IAsyncEnumerable и стриминг данных. В ней у автора упал прод, который пытался выдать 500 000 записей разом и упал на вызове ToListAsync() с OOM при 8 ГБ RAM. Далее в статье описывается, как все это стримить с помощью IAsyncEnumerable с примерами кода. В целом после прочтения статьи может сложиться впечатление, что все свои ToListAsync() срочно нужно убрать и заменить на стриминг.

Но со времен появления стримингового апи в .NET мне всегда было интересно, не только то как отдавать стримы, но и как это все получать на клиенте?

Читать далее

DeepSeek‑V4‑Flash на двух DGX Spark: как мы убрали очередь и получили multi‑user

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели9.8K

Подняли DeepSeek‑V4‑Flash на двух GB10, упёрлись в потолок consumer Blackwell, прошли три тупика со спекулятивным декодингом — и в итоге получили параллельную работу ресёрч-агента и длинной генерации без очереди. Цифры из Grafana.

Читать далее

Аллокации, которых нет в коде: охота на скрытый боксинг в .NET 10

Время на прочтение11 мин
Охват и читатели7.6K

Вы написали struct ради zero-allocation, прошли code review — а в проде Gen0-коллекции всё равно идут косяком. Самая дорогая аллокация та, которой нет в исходниках: компилятор молча упаковывает ваш value-тип в кучу там, где вы этого не просили.

Разбираю, где скрытый боксинг живёт и на .NET 10 (интерфейс на struct, foreach по IEnumerable, ValueType.Equals, params object[], замыкания), а где рантайм его уже вырезал — и почему слепо чинить HasFlag по гайдам 2015 года вредно. Два прод-кейса, шпаргалка-таблица, бенчмарк на BenchmarkDotNet и охота на box через DOTNET_JitDisasm и dotnet-gcdump.

Читать далее

Паттерны и подходы разработки, о которых все говорят — на примере .NET

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели8.9K

Паттерны проектирования, механизмы инфраструктуры, объектно-ориентированные паттерны часто изучают в отрыве от реальных задач, из-за чего их ценность кажется абстрактной теорией. Однако в .NET многие из них уже реализованы и используются ежедневно. Поводом для этой статьи стало желание показать, с какими из этих паттернов  мы каждый день работаем и что .NET — это не «черный ящик», а набор решений.

Я Александр Середин, ведущий разработчик в «БАРС Груп», в этой статье покажу путь от библиотеки классов до Web API и по шагам разберу, что мы используем (Composition Root, Dependency Injection, Generic Host, Options, HTTP‑pipeline) в .NET — как использовать их в качестве фундамента, а не пытаться изобретать собственные велосипеды.

Читать далее

Бенчмарк DGX Spark с LLM Qwen3: кому подойдет, почему 128 ГБ не серебряная пуля и о чем умолчал маркетинг NVIDIA

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели11K

У всех кто работает с LLM моделями случалось, что модель на 32B параметров не влезает в 24 ГБ VRAM вашей RTX 4090, offload на CPU убивает скорость, а облако — дорого и данные уходят на сторону. NVIDIA обещает нам решение: DGX Spark (он же GB10) с 128 ГБ unified memory за ~400-500 тысяч рублей. Мы потратили две недели на глубокие бенчмарки устройства и результаты оказались... неоднозначными.

В статье будет много графиков, сравнение нескольких форматов квантизации, тесты разных объемов подаваемого контекста, сравнения с более привычными GPU и оценка финансовой эффективности такой покупки. Цель бенчмарка разобраться, в каких ситуациях DGX Spark показывает свои преимущества, а где его архитектурные ограничения становятся узким местом и предпочтительнее выбирать другие решения.

Открыть бенчмарк

Дерево Фенвика

Время на прочтение3 мин
Охват и читатели61K
Здравствуй, Хабрахабр. Сейчас я хочу рассказать о такой структуре данных как дерево Фенвика. Впервые описанной Питером Фенвиком в 1994 году. Данная структура похожа на дерево отрезков, но проще в реализации.

Что это?


Дерево Фенвика — это структура данных, дерево на массиве, которая обладает следующими свойствами:
• позволяет вычислять значение некоторой обратимой операции F на любом отрезке [L; R] за логарифмическое время;
• позволяет изменять значение любого элемента за O(log N);
• требует памяти O(N);
Читать дальше →

p99 ×4 после деплоя на ровном месте: как Dynamic PGO в .NET 9 роняет ваш сервис по первым 30 вызовам

Время на прочтение19 мин
Охват и читатели3.9K

В .NET 9 Dynamic PGO включён по умолчанию, и это не просто “ещё +10–15% перформанса в релиз-ноутах”. Это новая среда обитания вашего кода. Один и тот же бинарник на одной и той же машине может работать в 3–5 раз медленнее или быстрее в зависимости от того, какие данные он увидел в первые секунды жизни.

Я называю это эффектом JIT-дрифта: метод “застывает” под профиль ранней нагрузки и потом не успевает перестроиться под реальный продакшен. Ниже - минимальный воспроизводимый пример на 20 строк, разбор того, что именно RyuJIT решает за вас, и чек-лист, как с этим жить на проде.

Читать далее

Используем несколько нейронок безопасно и через единый интерфейс. Инструкция по внедрению LiteLLM

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели21K

Есть несколько очевидных проблем с LLM: утечка конфиденциальных данных и кода, компрометация токенов, зависимость от внешних провайдеров. О них знают все, но это никого не останавливает. Даже если руководитель решит перестраховаться и не выделит деньги на LLM, сотрудники купят подписку сами и продолжат ими пользоваться, потому что это удобно. Есть и менее очевидные сложности: например, одна команда может потратить все токены, и их придется докупать.

Привет, я Павел Мохляков. Вообще я Data Science-инженер в Cloud.ru, но сегодня решил, почему бы не рассказать как с помощью LLM-шлюза можно использовать несколько LLM через один API и при этом снизить риск утечки данных, контролировать расходы и соблюдать требования №152-ФЗ. Кроме того, покажу пример тестового подключения и объясню, что делать на каждом этапе.

Сразу оговорюсь, что статья будет полезна, скорее всего, инженерам, архитекторам, да и просто человекам-оркестрам из средних и малых компаний, которым нужно относительно быстро и безопасно внедрить у себя LLM. А вот для крупного бизнеса или, например, КИИ явно нужно что-то другое — посерьезнее и понадежнее.

Читать далее

MarkMello: быстрый Markdown viewer для тех, кто каждый день живёт в .md

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели24K

В последнее время я почти каждый день работаю с Markdown-файлами.

Документация, спецификации, ADR, планы реализации, инструкции для AI-агентов — всё это удобно держать в .md. Формат простой, читаемый, хорошо ложится в git и нормально работает как для человека, так и для модели.

Но есть бытовая проблема.

Чтобы быстро посмотреть Markdown-файл, часто приходится открывать IDE. Разумеется да, любая нормальная IDE умеет показывать .md. Но запускать ради этого полноценную среду разработки — избыточно. Особенно если задача простая: кликнуть по файлу, быстро прочитать, скопировать кусок текста, закрыть.

Я начал искать лёгкий Markdown viewer и понял, что большинство найденных вариантов меня не устраивают.

Читать далее

FreeAIr: доступ к локальной или корпоративной LLM из Visual Studio 2022/2026

Время на прочтение7 мин
Охват и читатели6.3K

FreeAIr - это расширение (vsix) для Visual Studio 2022/2026, которое позволяет использовать локальную или корпоративную LLM внутри Visual Studio для помощи программисту. Это не Copilot, а независимая разработка авторов из РФ. FreeAIr не содержит spyware, никуда не отправляет ни код, ни переписку, ни телеметрию (ничего не отправляет), и поэтому может использоваться в компаниях, где использование внешних LLM запрещено политикой конфиденциальности.

Читать далее

Лишние вычисления

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели16K

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

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

Ответом на это стало не ускорение памяти, а усложнение самих процессоров, которые перестали быть просто пассивными исполнителями кода и стали решать задачи управления потоком данных: выполнять инструкции вне порядка, переупорядочивать зависимости и на каком‑то этапе подошли к идее спекулятивно исполнять код, который, возможно, вообще не понадобится.

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

Именно здесь возникает интересный и неочевидный компромисс, позволяющий с одной стороны, писать branchless‑код и полностью избавиться от ошибок предсказания, а с другой лишающий процессор возможности работать на опережение и запускать доступ к памяти раньше времени. Но в зависимости от того, где находятся данные в памяти выигрывать будет то один, то другой подход.

Если вы собираетесь писать branchless код, надо помнить как именно спекулятивное выполнение и предсказание ветвлений взаимодействуют с подсистемой памяти, потому что «лишняя работа» иногда ускоряет программу, а в некоторых случаях попытка сделать код более «предсказуемым» приводит к обратному эффекту.

Читать далее

Доработка алфавитно-цифрового ЖК-модуля 1602A (ЖКИ LCD1602) для работы от 3.3V

Уровень сложностиСложный
Время на прочтение3 мин
Охват и читатели14K

Эти модули китайского производства широко доступны на AliExpress, Озон, WB и предназначены для работы при питании напряжением 5.0V в диапазоне температур 0..+50C в стандартном исполнении.

Читать далее

Информация

В рейтинге
5 552-й
Зарегистрирован
Активность