Помогите мне понять производительность и поведение спящих потоков - PullRequest
2 голосов
/ 01 июня 2011

Допустим, я создал несколько потоков (~ 100) и уложил большинство из них в спящий режим, в то время как некоторые из них работают над проблемами, связанными исключительно с процессором. Что влияет на производительность по сравнению с JUST, создавая несколько потоков, которые выполняют работу, а не потоков, которые спят? Действительно ли существование многих потоков, независимо от того, находятся ли они в спящем режиме, значительно снижает производительность из-за переключения всех контекстов, ИЛИ в основном ли спящие потоки игнорируются и ЦП делится в основном между активными потоками?

Я не ищу такой ответ, как "50% снижение производительности", я просто пытаюсь более подробно понять, как спящие потоки влияют на процессор, доступный для других потоков.

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

Основываясь на тегах .net, я предполагаю, что вы имеете дело с потоками в Windows.

По крайней мере, в случае обычного планировщика Windows, спящие потоки обычно оказывают минимальное влияние на производительность.

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

Однако, когда поток спит, онобычно не потребляет процессорное время на постоянной основе.

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

1 голос
/ 01 июня 2011

Потоки в любом состоянии, кроме «работает», не работают.«Готовые» потоки могут работать и ожидают, когда процессор станет доступным.Изменение контекста может происходить только между запущенным потоком и готовым потоком.

Как говорит Натан - не может быть переключения контекста в / из спящих потоков.

Тем не менее, если вы разберетесь в состоянии системы ОС с тысячами спящих потоков, тогда может произойти небольшое, измеримое увеличение планирования / диспетчеризации, поэтому я не хотел бы сказать, что никакого эффекта неттолько то, что нет никакого эффекта, относящегося к 99,999% приложений.

Вы можете легко написать тест для этого.Создайте 1000 спящих (бесконечных) потоков в цикле и просто оставьте их.Используй свою коробку.Кажется ли Firefox другим при рендеринге веб-страниц?Utorrent медленнее?С помощью Excel создайте смехотворно большую электронную таблицу, чтобы время пересчета можно было измерить с помощью секундомера.Это медленнее с дополнительными 1000 спящими потоками?

Сколько потоков загружено в вашей системе сейчас?Мой диспетчер задач / Производительность говорит 1195. Большинство из них не работают, потому что загрузка процессора составляет 0-1%.Моя коробка работает нормально.

Rgds, Martin

0 голосов
/ 01 июня 2011

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

Вот хорошая статья о пулах тем, которая также отвечает на ваш вопрос:

http://www.theukwebdesigncompany.com/articles/iocp-thread-pooling.php

Я бы посоветовал вам либо использовать меньшее количество потоков, либо воспользоваться преимуществами новых возможностей .NET 4.0, которые действительно революционизируют потоки в приложениях.

http://www.albahari.com/threading/#_Introduction

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...