<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль vvdev]]></title>
    <link>https://habr.com/ru/users/vvdev/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя vvdev]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sun, 26 Apr 2026 21:20:22 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>28.11.2025 01:59:23 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/959980/#comment_29175554</guid>
      <link>https://habr.com/ru/articles/959980/#comment_29175554</link>
      <description><![CDATA[<p>Бывает.</p><p>Поведение странное только если вдруг упёрся в производительность, но тогда сам бог велел изучить вопрос.</p><p>А пока не упёрся - что бывает в 99% случаев - отличный прозрачный safeguard.</p>]]></description>
      <pubDate>Fri, 28 Nov 2025 01:59:23 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>06.11.2025 14:10:12 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/articles/959126/#comment_29072738</guid>
      <link>https://habr.com/ru/companies/pvs-studio/articles/959126/#comment_29072738</link>
      <description><![CDATA[<p>И как предлагаете IList и ReadOnlyCollection приводить к спану?</p>]]></description>
      <pubDate>Thu, 06 Nov 2025 14:10:12 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>25.10.2025 12:58:05 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/959980/#comment_29013342</guid>
      <link>https://habr.com/ru/articles/959980/#comment_29013342</link>
      <description><![CDATA[<blockquote><p>Есть прикол, что компилятор может неявно создавать копии readonly структур, чтобы гарантировать их имутабельность.&nbsp;  </p></blockquote><p>Такого прикола нет, есть прикол с не-readonly структурами в readonly контексте.</p><p>Читайте документацию, она прикольная.</p>]]></description>
      <pubDate>Sat, 25 Oct 2025 12:58:05 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>25.10.2025 12:13:43 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/959980/#comment_29013208</guid>
      <link>https://habr.com/ru/articles/959980/#comment_29013208</link>
      <description><![CDATA[<blockquote><p>Мы же не пишем сортировку руками, а применяем OrderBy</p></blockquote><p>Вообще-то, "мы" ещё как пишем, потому, что OrderBy - это куча аллокаций, да ещё и приведение к IEnumerable&lt;&gt; со всеми вытекающими.</p><p>"Мы" и поиск, случается, пишем, и вообще много всего, что есть в стандартной библиотеке.</p><p>Так что "мы" разные.</p>]]></description>
      <pubDate>Sat, 25 Oct 2025 12:13:43 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>19.09.2025 12:41:45 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/947922/#comment_28857286</guid>
      <link>https://habr.com/ru/articles/947922/#comment_28857286</link>
      <description><![CDATA[<p>У ArrayPool.Shared достаточно низкий лимит количества массивов в пуле.<br>Проверьте, возможно у вас одномоментно требуется сверх того и пул продолжает выделять и выбрасывать слишком много инстансов.</p><p>Если так - стоит попробовать использовать ArrayPool.Create со своими настройками. Но он - ConfigurableArrayPool заметно медленнее в многопоточном high throughput. Нужно будет отбенчмаркать.</p><p>В моём случае переход со стандарного ConfigurableArrayPool на самописную адаптацию стандартного же SharedArrayPool дал очень ощутимый прирост. Но я микро и нано секунды ловлю, на уровне миллисекунд может и не заметно разницы в скорости.</p>]]></description>
      <pubDate>Fri, 19 Sep 2025 12:41:45 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>06.08.2025 11:53:16 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28669222</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28669222</link>
      <description><![CDATA[<p>Такими темпами мы сейчас перепишем вашу систему на .НЕТ и отпрофилируем заодно.</p><p>Валидация тяжелая, IsValid не возвращает деталей - ок, усложним по-быстрому, будем кешировать и переиспользовать известные детали/проблемы процессинга:</p><pre><code class="cs">struct ItemProcessingContext
{
  // Содержит поля и флаги, в которых мы можем сохранять
  // результаты различных этапов процессинга записи
}


...

  
ItemProcessingContext context = default;
if (!TryProcess(item, ref context)) Postpone(item, ref context);


или


ItemProcessingContext context = default;
if (IsValid(item, ref context)) Process(item, ref context);
else Postpone(item, ref context);


или


ItemProcessingContext context = default;
if (TryGetStrategy(item, ref context, out var strategy))
{
  strategy.Process(item, ref context);
}
else
{
  // внутри, возможно, будет throw. А может и нет.
  ProcessUnexpectedCase(item, ref context);
}

// если дошли сюда - можем проанализировать накопленный контекст
// и сделать ещё что-нибудь, если вдруг нужно
PostProcessContext(item, ref context);</code></pre><p>Ну и не забываем, что каждый уровень должен решать возникающие проблемы в рамках своей ответственности, всё неожиданное выбрасывать наверх.</p><p>БД не сумела сохранить данные? - ретрай и если снова не удалось - исключение.<br>Кэш уже содержит запись для ключа? - молча игнорирует.<br>А другая имплементация, возможно, кидает DuplicateKeyException.</p><p>И так далее.</p><p>Сути не меняет:<br>Если у нас есть известный случай и мы его поддерживаем - нормальная его обработка проходит без исключений.<br>Неизвестный случай или ошибка процессинга, о котором мы знаем, как сообщить на уровень выше (наш контракт имеет необходимые для этого свойства/типы) - нормальный процессинг, не знаем, как сообщить наверх - исключение.</p><p>Доведём мой подход до абсолюта: "идеал" по умолчанию - "все" методы возвращают void, со своими проблемами справляются сами, выполненный метод означает успех, иначе - исключение, означает нерешенную проблему. Простой линейный контрол флоу.</p><p>А уже в дальнейшем, для обеспечения необходимой гибкости/производительности начинаем вводить необходимые типы/коды возвратов, шаред контексты, стадии обработки, ветвления и прочее, и прочее - в минимально необходимых рамках "нормально" поддерживаемых случаев.</p>]]></description>
      <pubDate>Wed, 06 Aug 2025 11:53:16 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>06.08.2025 09:38:27 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28668536</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28668536</link>
      <description><![CDATA[<p>Так, ну раз пошла такая пьянка, то давайте уже и я отвечу взаимностью и разверну немного свою т.з.</p><p>Перво-наперво - теги у статьи .NET/C#, с этих позиций я и выступаю, понимаю, что могут быть рантаймы/архитектуры, где всё по-другому.</p><p>Повторю, да, throw в .NET достаточно/относительно тяжелый, нужно это учитывать, но при правильном применение - более чем годный.<br>Правильное применение - это не пытаться использовать исключения как оператор ветвления.</p><p>Дальше, как я вижу предложенный пример с "миллионами записей, некоторые из них нужно отложить".<br>На примитивном уровне - это два варианта данных, причём для обоих у меня есть алгоритм обработки. Поэтому код выглядел бы как-то так:</p><pre><code class="cs">if (!TryProcess(item)) Postpone(item);</code></pre><p>или</p><pre><code class="cs">if (IsValid(item)) Process(item);
else Postpone(item);</code></pre><p>А вот если Process или Postpone не справились - то они выкидывают исключение, которое улетает выше - и там уже, возможно, мы решаем что с этим делать.<br>Потому, что это явно случай, к которому мы не готовы, не важно по какой причине, но что делать мы на этом уровне не знаем.<br>(кстати, TryProcess хоть и не должен бы, но тоже может выкинуть исключение, если там совсем что-то непредвиденное)</p><p>А на уровне выше, может и знаем - например, пропускаем эту запись и идём дальше (как я описывал выше), а может и вообще всё рушим и перезапускаем машину ;)</p><p>Но важно то, что если таких случаев становится слишком много, то мы их анализируем и добавляем обработчик(и), тем самым опять снижаем частоту исключений.<br>И код становится примерно таким:</p><pre><code class="cs">if (TryGetStrategy(item, out var strategy))
{
  strategy.Process(item);
}
else
{
  throw new UnexpectedDataException(item);
}
</code></pre><p>Кстати, выбранная стратегия тоже может выкинуть исключение, если она по какой-либо причине не справилась, логика выше по стеку остаётся такой же, как и была.</p><p>Иначе говоря: поддерживать все известные случаи, в неизвестном - выкидывать исключение, но таких случаев должно оставаться как можно меньше.</p><p>Как-то так.</p>]]></description>
      <pubDate>Wed, 06 Aug 2025 09:38:27 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>06.08.2025 08:19:54 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28668142</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28668142</link>
      <description><![CDATA[<blockquote><p>Вот. А дальше? Данные невалидны. Что дальше? Вернуть какой-то result или бросить исключение через throw? Вот о чем разговор.  </p></blockquote><p>В общем случае так: если у меня есть обработчик для такого [невалидного] состояния - вызвать его, иначе - исключение, всё прерывается, исключение улетает выше - может быть там знают, что с ним делать.</p>]]></description>
      <pubDate>Wed, 06 Aug 2025 08:19:54 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>05.08.2025 21:52:17 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/otus/articles/932888/#comment_28666748</guid>
      <link>https://habr.com/ru/companies/otus/articles/932888/#comment_28666748</link>
      <description><![CDATA[<blockquote><p>В случае с параметрами метода если не хотим дефенсив копи делаем параметр ref readonly вместо in.  </p></blockquote><p>Это ошибка, причём потенциально весьма дорогая: поведение in и ref readonly с точки зрения defensive copy - идентичное, копия создаётся.</p><p>Зашита от defensive copy - readonly struct, прямое чтение полей, пометки методов/пропертей как readonly или магия Unsafe.AsRef.<br>Ну, или передача как ref-параметр.<br>Других вариантов нет.</p>]]></description>
      <pubDate>Tue, 05 Aug 2025 21:52:17 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>05.08.2025 13:58:21 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28665094</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28665094</link>
      <description><![CDATA[<p>...Да, и вот кстати: в C# использую goto не так, чтобы часто, но регулярно - сильно упрощает жизнь в некоторых случаях, часть из которых уже упомянули.</p><p>Считаю его незаменимым инструментом, хоть и излишне "задушенным" в C#. Понятно зачем и почему - но всё равно хотелось бы ещё чуть больше свободы.</p>]]></description>
      <pubDate>Tue, 05 Aug 2025 13:58:21 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>05.08.2025 12:43:16 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28664788</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28664788</link>
      <description><![CDATA[<blockquote><p>А что вы строите на исключениях? 99% "ошибок" - это логика, требующая обработки.  </p></blockquote><p>В моём понимании (и практике) ровно наоборот - условные "99% ошибок" внутри процессинга - это прерывающие исключения.<br>Всё, что не прерывает - это нормальный случай, он выбирается по условиям/анализу/валидации параметров-данных. Или тот самый Try*-pattern.</p><p>Да, бывают, опять же, внешние неконтролируемые зависимости с высокой частотой throw по любому поводу - приходится заменять или минимизировать ущерб.</p><p>Одноразовые (per API call/button press) проверки - вообще, как правило, не влияют на картину throughput, могут быть построены как угодно (до известной степени, конечно). </p><p>...если что - обработка миллиардов итераций per-API-call (в том числе с необходимостью обработки исключений на горячем пути) - специфика моих систем в последние долгие уже годы, так что "цену" разных мелочей я прочувствовал и понимаю. И как показывает моя практика - оптимизация нормального/expected случая "весит" куда больше, чем возможные исключения.</p>]]></description>
      <pubDate>Tue, 05 Aug 2025 12:43:16 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>05.08.2025 12:09:26 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28664660</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28664660</link>
      <description><![CDATA[<blockquote><p>Как вы себе представляете работу try/catch без throw где-то внутри?  </p></blockquote><p>Не "без throw где-то внутри", а "без try-catch внутри длинного цикла".<br>Запросто, try-catch снаружи цикла, если нужно прервать цикл при исключении. Если нужно "пропускать" "исключительные" итерации и продолжать дальше - внешний while/do-while/или-даже-for, внутри подготовка условий и контекста для внутреннего цикла,  try-catch, внутри него - внутренний цикл по подготовленным условиям и контексту.<br>Вариантов масса.</p><blockquote><p>Обработка миллиона записей (а это немного на самом деле, бывает и кратно больше) где могут случаться какие-то нештатные ситуации, которые нужно отложить для последующего ручного разбора и идти дальше.  </p></blockquote><p>И таких "исключительных" записей ожидается больше, чем погрешность от общего количества? - тогда это выглядит не как исключительный случай, а как вариант нормы - здесь просится валидация данных итерации и выбор одного из путей обработки или условный if (!TryProcess(...)) { ... }  - зачем строить такую логику на исключениях?<br>Внешние неконтролируемые зависимости внутри цикла? - переписать согласно предыдущей рекомендации, прогнать нагрузочные - если всё ещё неприемлемо - заменить зависимости на самописные/более подходящие.</p><p>В любом случае, этот пример - хорошая иллюстрация использования неподходящей техники, а не ущербности исключений. </p>]]></description>
      <pubDate>Tue, 05 Aug 2025 12:09:26 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>05.08.2025 11:30:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/933454/#comment_28664484</guid>
      <link>https://habr.com/ru/articles/933454/#comment_28664484</link>
      <description><![CDATA[<blockquote><p>начнут строго спрашивать за производительность</p></blockquote><p>try-catch-finally/using практически бесплатны (если не помещать их внутри длинного цикла на горячем пути, конечно)</p><p>throw дорогой, но - можно пример сценария, при котором throw начинает влиять на производительность нормального/expected случая, а значит и среднюю производительность?</p><blockquote><p>избегать большой вложенности вызовов (и большой глубины стека) - это тоже хороший стиль</p></blockquote><p>Более чем спорно</p>]]></description>
      <pubDate>Tue, 05 Aug 2025 11:30:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.07.2025 04:26:04 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/otus/articles/922898/#comment_28555830</guid>
      <link>https://habr.com/ru/companies/otus/articles/922898/#comment_28555830</link>
      <description><![CDATA[<p>Да, был не прав, задумался о своём.</p><p>Конечно же, и поля не даёт напрямую изменить, и сеттер для проперти вызвать.</p>]]></description>
      <pubDate>Fri, 11 Jul 2025 04:26:04 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.07.2025 14:38:54 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/otus/articles/922898/#comment_28554196</guid>
      <link>https://habr.com/ru/companies/otus/articles/922898/#comment_28554196</link>
      <description><![CDATA[<p>Термин defensive copy применительно к не-ридонли структурам о чём-нибудь говорит?</p>]]></description>
      <pubDate>Thu, 10 Jul 2025 14:38:54 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>01.07.2025 16:14:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/otus/articles/922898/#comment_28514036</guid>
      <link>https://habr.com/ru/companies/otus/articles/922898/#comment_28514036</link>
      <description><![CDATA[<p>Вообще-то - нет, не избегает. Ровно такое же поведение с т.з. defensive copy.</p>]]></description>
      <pubDate>Tue, 01 Jul 2025 16:14:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>22.06.2025 14:24:26 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/920390/#comment_28470292</guid>
      <link>https://habr.com/ru/articles/920390/#comment_28470292</link>
      <description><![CDATA[<p>Важно, что LinkedList выделяет в куче индивидуальные ноды, тогда так List  - массивы (с запасом).</p><p>Если списки не настолько большие, чтобы перейти в LOH,  то начиная с определённого момента затраты на GC и "утрамбовку" памяти для списка могут стать гораздо дешевле, чем для связного списка.</p><p>Не знаю как в вашем случае, а для какого-нибудь хайлоада/хай срупута я бы предпочел список (если быть до конца точным - структуру, основанную на массивах и не допускающую попадания в ЛОХ)</p>]]></description>
      <pubDate>Sun, 22 Jun 2025 14:24:26 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>14.06.2025 12:27:33 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/otus/articles/915662/#comment_28436202</guid>
      <link>https://habr.com/ru/companies/otus/articles/915662/#comment_28436202</link>
      <description><![CDATA[<blockquote><p>На мой взгляд Zero-Alloc LINQ можно было бы реализовать 100% безопасным кодом  </p></blockquote><p>Есть опыт?</p><p>Я бы лично с удовольствием (и благодарностью) ознакомился, особенно под .НЕТ ниже седьмого.</p>]]></description>
      <pubDate>Sat, 14 Jun 2025 12:27:33 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>14.06.2025 03:19:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/skbkontur/articles/914868/#comment_28435046</guid>
      <link>https://habr.com/ru/companies/skbkontur/articles/914868/#comment_28435046</link>
      <description><![CDATA[<p>Тут есть очень много "но".</p><p>Демонстрационный пример очень удачный, так как у нас простой фаст-трак/хэппи пас и несколько обработчиков исключительных ситуаций, куда мы выпадаем редко и передаём в них минимум параметров.</p><p>Теперь представим себе, что основная логика и она же - хэппи пас у нас реально объёмная. Она может быть простая, ветвлений минимум, фаст трак (проверки условий, после которых в 99% мы просто переходим на следующую инструкцию) - но объём метода в целом сотни строк, если не тысяча/чи.</p><p>Допустим, мы хотим сделать его менее врайт-онли и поделить на более короткие методы с ограниченными ответственностями. Ок, но теперь в каждый выделенный метод мы должны передавать весь необходимый контекст - что запросто может оказаться десятком параметров. А некоторые параметры у нас, к примеру, относительно объёмные структуры. Ок, передаём их по ссылке. Но, теперь у нас ещё и локальность данных размазалась по стеку.</p><p>Не уверен, что джит всё это заинлайнит и вернёт наш исходный фаст трак, даже если повесить на каждый метод агрессив инлайнинг.</p><p>Ну, как не уверен? Эмпирически знаю - не заинлайнит.</p><p>В итоге мы поделили наш фаст трак на несколько вызовов-возвратов, к каждому из которых добавляется копирование всех нужных параметров.</p><p>И ради чего? Читабельность? Это, конечно, хорошо, но не всегда стоит потерь производительности.</p><p>И это только первое из многих "но" :)</p><p>Я к чему? Без бенчмарков и профилирование на разных сценариях я лично никаких сложных и объёмных методов на горячем пути разделять не советовал бы.</p><p>...объединять, кстати, на моём опыте - менее рисковано.</p>]]></description>
      <pubDate>Sat, 14 Jun 2025 03:19:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>03.05.2025 12:19:27 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/906144/#comment_28252976</guid>
      <link>https://habr.com/ru/articles/906144/#comment_28252976</link>
      <description><![CDATA[<p>Нет, массив всегда есть последовательный непрерывный блок памяти.</p><p>Оператор fixed просто запрещает GC перемещать блок памяти (на время своего действия).</p><p>А как ключевое слово - позволяет объявить инлайн-буфер заданной длины внутри unsafe-структуры.</p><blockquote><p>Когда вы обрабатываете 10 байт это одно а когда 10 гигабайт это другое.  </p></blockquote><p>Когда 10 байт лежат рядом в текущей кэш-линии - это одно, а когда их нужно прочитать непосредственно из DRAM - это совсем другое.</p>]]></description>
      <pubDate>Sat, 03 May 2025 12:19:27 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
