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

preview_player
Показать описание
— —
Ошибки и проблемы использования многопоточности в .NET.

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

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

В докладе рассмотрим несколько примеров, когда использование средств из стандартной библиотеки .NET (Task.Delay, SemaphoreSlim, ConcurrentDictionary) привело к просадкам производительности, и поговорим о решениях, заточенных под конкретные задачи и лишённых этих недостатков. Также заглянем в internal-часть дотнета и посмотрим на использующиеся там подходы.
Рекомендации по теме
Комментарии
Автор

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

ivan-e-th
Автор

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

Поправьте если ошибаюсь, буду благодарен. Не эксперт еще в ваших асинках и многопоточках :)

swatarcommon
Автор

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

alexanderpanfilenok
Автор

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

superspy