Обновить
-3

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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

Вы написали 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.5K

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

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

Читать далее

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

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

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

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

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

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

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

Что это?


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

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

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

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

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

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

Читать далее

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

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

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 в стандартном исполнении.

Читать далее

Структуры данных на практике. Глава 6: Стеки и очереди

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

«Простота — требование, необходимое для обеспечения надёжности», — Эдсгер Дейкстра

Невидимая структура данных

В каждой программе используется стек — стек вызовов. Каждый вызов функции записывает в стек кадр, каждый возврат извлекает его. Он настолько фундаментален, что мы редко о нём задумываемся.

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

Однажды я отлаживал вылет прошивки во встраиваемой системе RISC-V. У системы был планировщик задач, использующий очередь для управления ожидающими задачами. При большой нагрузке система вылетала с переполнением стека.

Переполнение стека? Очередь должна была находиться в куче, а не в стеке.

Проблема заключалась не в самой очереди, а в том, как она была реализована. Для очереди использовался связанный список, и каждый вызов malloc() выполнял распределение из пула памяти, делившего пространство со стеком. Под нагрузкой очередь разрасталась, пул фрагментировался и рано или поздно стеку не оставалось места для роста.

Как же мы устранили проблему? Заменили очередь на основе связанного списка кольцевым буфером — очередью на основе массива фиксированного размера, получив при этом отсутствие динамического распределения, предсказуемое использование памяти и десятикратный рост скорости.

Читать далее

Как Майкл Абраш удвоил скорость Quake

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

Вместе с релизом в 1999 году исходного кода Quake был выпущен файл readme.txt, написанный Джоном Кармаком. Особый интерес в нём вызвало одно предложение:

Также для сборки файлов на языке ассемблера требуется Masm. Можно изменить #define и выполнять сборку только с кодом на C, но версии с программным рендерингом при этом потеряют почти половину скорости.

Quake был вдвое быстрее благодаря написанному вручную ассемблерному коду? Давайте разберёмся, так ли это, как это работает, и какими были самые важные оптимизации.

Читать далее

Merge для IAsyncEnumerable<T>

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

В рамках одного из обсуждении с чатах я предложил использовать функцию Merge для  IAsyncEnumerable<T>, чтобы объединить результаты чтения однотипных данных из разных источников. Но когда попытался сделать пример оказалось что такой функции в System.Linq.Async нет. Есть аналог в Reactive Extensions, но тащить библиотеку для одного примера не захотел и решил написать сам.

Читать далее

Архивация. Где лучше хранить холодные данные? Полный обзор на все типы физических носителей от FDD до LTO и M-disk

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

На написание этой статьи меня сподвигнуло прослушивание выпуска подкаста Запуск завтра - Цифровая хрупкость. Как сохранить важное в сети (Episode 8 Season 13). После которого у меня сложилось впечатление что гостья не разбирается в архивации, хотя вроде бы эксперт, а Самат называет не верные факты, например он говорит, что данные на LTO лентах хранятся до 100 лет, хотя даже производители на упаковке пишут 30 лет. По этому я решил сделать максимально полный обзор на все типы физических носитиелей которые доступны обычному человеку сегодня. FDD, NAND, CD, DVD, BD, SSD, HDD, LTO. А также попробую посчитать экономику и разобраться когда например выгоднее оставаться на HDD, а когда уже пора переходить на LTO.

Читать далее

Гайд: Как прострелить ноги unsafe кодом в C#

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

ДИСКЛЕЙМЕР: Это статья является ручным переводом оригинальной статьи с небольшими пояснениями. Поводом для перевода стало слишком частое использование unsafe кода в других статьях о C# на русском языке в том числе тут на хабре.

Читать далее

Расширение известного трюка с XOR на миллиарды строк: введение в обратимые фильтры Блума

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

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

Читать далее

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность