Евгений Пешков - Многопоточность в .NET: когда производительности не хватает
HTML-код
- Опубликовано: 24 авг 2024
- Ближайшая конференция - DotNext 2024, 10 - 11 сентября, Москва + online
Подробности и билеты: jrg.su/x2GKnA
- -
Ошибки и проблемы использования многопоточности в .NET.
Платформа .NET предоставляет множество готовых примитивов синхронизации и потокобезопасных коллекций. Если при разработке приложения нужно реализовать, например, потокобезопасный кэш или очередь запросов - обычно используются эти готовые решения, иногда сразу несколько. В отдельных случаях это приводит к проблемам с производительностью: долгим ожиданием на блокировках, избыточному потреблению памяти и долгим сборкам мусора.
Эти проблемы можно решить, если учесть, что стандартные решения сделаны достаточно общими - они могут иметь избыточный в наших сценариях оверхед. Соответственно, можно написать, например, собственную эффективную потокобезопасную коллекцию для конкретного случая.
В докладе рассмотрим несколько примеров, когда использование средств из стандартной библиотеки .NET (Task.Delay, SemaphoreSlim, ConcurrentDictionary) привело к просадкам производительности, и поговорим о решениях, заточенных под конкретные задачи и лишённых этих недостатков. Также заглянем в internal-часть дотнета и посмотрим на использующиеся там подходы.
Спасибо, редкий доклад, приближённый к жизни, а не к сферическим коням...
24:40
Возможно, дело в первом обращении к Console. Поток в TASK-1 пытается инициализировать стандартный метод вывода, как минимум его геттер использует lock. Поэтому TASK-1 планирует продолжение после инициализации. В это время поток в TASK-2 видит на "await", что он не завершен и уйдет в ThreadPool. Затем TrySetResult приведет к синхронному продолжению в том же потоке, ну и заблокирует его. 2 не выведется. Если без Console (или это не первое обращение к ней), два потока выполнят все синхронно, так как Task на await уже будет выполнен.
Поправьте если ошибаюсь, буду благодарен. Не эксперт еще в ваших асинках и многопоточках :)
Почему автор считает, что удаление таймера из TimerQueue происходит за O(1)? Таймеры всегда удаляются из начала списка?
Вопрос снимается. Вероятно после однократного выполнения айтем сразу удаляется из списка
интересно, зачем писать текст слайдов на английском, если в заголовке есть русские слова и иностранные граждане не все поймут?
То есть то, что весь доклад на русском и иностранцы вряд ли его поймут, даже если слайды полностью будут на английском, тебя не смущает?
У меня на работе все термины даже в обычной переписке должны быть на английском. Мне вообще интересно кто-то из разработчиков использует локализированную версию Windows или Visual Studia?
Большинство проблем и обозначений ищутся в интернете и используется в речи именно на английском. Можно считать это их ID. Pool Exhaust, memory traffic итд.