Евгений Пешков - Многопоточность в .NET: когда производительности не хватает

Поделиться
HTML-код
  • Опубликовано: 24 авг 2024
  • Ближайшая конференция - DotNext 2024, 10 - 11 сентября, Москва + online
    Подробности и билеты: jrg.su/x2GKnA
    - -
    Ошибки и проблемы использования многопоточности в .NET.
    Платформа .NET предоставляет множество готовых примитивов синхронизации и потокобезопасных коллекций. Если при разработке приложения нужно реализовать, например, потокобезопасный кэш или очередь запросов - обычно используются эти готовые решения, иногда сразу несколько. В отдельных случаях это приводит к проблемам с производительностью: долгим ожиданием на блокировках, избыточному потреблению памяти и долгим сборкам мусора.
    Эти проблемы можно решить, если учесть, что стандартные решения сделаны достаточно общими - они могут иметь избыточный в наших сценариях оверхед. Соответственно, можно написать, например, собственную эффективную потокобезопасную коллекцию для конкретного случая.
    В докладе рассмотрим несколько примеров, когда использование средств из стандартной библиотеки .NET (Task.Delay, SemaphoreSlim, ConcurrentDictionary) привело к просадкам производительности, и поговорим о решениях, заточенных под конкретные задачи и лишённых этих недостатков. Также заглянем в internal-часть дотнета и посмотрим на использующиеся там подходы.

Комментарии • 9

  • @ivan-e-t5h
    @ivan-e-t5h 3 года назад +2

    Спасибо, редкий доклад, приближённый к жизни, а не к сферическим коням...

  • @swatarcommon
    @swatarcommon Год назад

    24:40
    Возможно, дело в первом обращении к Console. Поток в TASK-1 пытается инициализировать стандартный метод вывода, как минимум его геттер использует lock. Поэтому TASK-1 планирует продолжение после инициализации. В это время поток в TASK-2 видит на "await", что он не завершен и уйдет в ThreadPool. Затем TrySetResult приведет к синхронному продолжению в том же потоке, ну и заблокирует его. 2 не выведется. Если без Console (или это не первое обращение к ней), два потока выполнят все синхронно, так как Task на await уже будет выполнен.
    Поправьте если ошибаюсь, буду благодарен. Не эксперт еще в ваших асинках и многопоточках :)

  • @alexanderpanfilenok6818
    @alexanderpanfilenok6818 5 лет назад

    Почему автор считает, что удаление таймера из TimerQueue происходит за O(1)? Таймеры всегда удаляются из начала списка?

    • @alexanderpanfilenok6818
      @alexanderpanfilenok6818 5 лет назад

      Вопрос снимается. Вероятно после однократного выполнения айтем сразу удаляется из списка

  • @superspy2008
    @superspy2008 5 лет назад +7

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

    • @semen083
      @semen083 5 лет назад +13

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

    • @npopovn
      @npopovn 2 года назад +4

      У меня на работе все термины даже в обычной переписке должны быть на английском. Мне вообще интересно кто-то из разработчиков использует локализированную версию Windows или Visual Studia?

    • @tmteam8840
      @tmteam8840 2 года назад +1

      Большинство проблем и обозначений ищутся в интернете и используется в речи именно на английском. Можно считать это их ID. Pool Exhaust, memory traffic итд.