Проблемы с производительностью фоновых рабочих - PullRequest
0 голосов
/ 05 февраля 2010

У меня есть 15 BackgroundWorer, которые работают все время, каждый из них работает примерно полсекунды (делает веб-запрос), и ни один из них никогда не останавливается.

Я заметил, что моя программазанимает около 80% процессорных ресурсов моего компьютера и около 15 МБ памяти (Core 2 Duo, 4 ГБ памяти DDR2).

Это нормально?веб-запросы не являются тяжелыми, они просто отправляют и ждут ответа сервера, и да, запуск 15 из них на самом деле не является производительным действием (необходима скорость), но я не думал, что это будет настолько интенсивно.

Я новичок в программировании, и вряд ли когда-либо (как и любой новый программист, я полагаю) беспокоюсь о производительности, но на этот раз это смешно, 80% использования ресурсов обработки для приложения Windows Forms с двумя списками ифоновые работники, делающие веб-запросы, не полностью соответствуют ожиданиям.

info:

  • Я использую обработку исключений как часть своей рутины, которую я однажды прочитал, что это не очень хорошодля производительности
  • У меня есть 15 фоновых рабочих
  • Мой код уверяет, что ни один из них никогда не простаивает
  • Элемент списка
  • формы Windows, Visual Studio, c #.

------ [править - вопросы в ответах] ------

Что именно вы подразумеваете под "Мой код уверяет, что никто из них никогда не бездействует "?
ogram остается в ожидании

while (bgw1.IsBusy || gbw2.IsBusy ... ... ...) { Application.DoWork();}

, а затем, когда любой из них становится свободным, возвращается к работе.

Не могли бы вы дать более подробную информацию о рабочей нагрузке, на которую вы это ставите?
Я создаю объект веб-запроса HTTP, открываю его и жду запроса сервера.На самом деле он содержит всего пару строк и не требует интенсивной обработки, полсекунды приходится на ожидание сервера.

Каким образом и сколько исключений выдается? Когда страницане существует, есть system.WebException, когда он работает, он возвращает «ОК», и около 99% проверяемых мной страниц не существует, поэтому я бы сказал, что около 300 исключений в минуту (говоря такэто звучит жутко, я знаю, но это работает)

Если вы работаете в отладчике, то исключения намного дороже, чем они были бы, если бы не отладка Я неГоворя о запуске его в отладчике, я запускаю исполняемый файл, полученный в результате EXE.

Ответы [ 4 ]

2 голосов
/ 05 февраля 2010
while (bgw1.IsBusy || gbw2.IsBusy ... ... ...) { Application.DoWork();}

Что Application.DoWork(); делает? Если он что-то делает быстро и возвращается, один этот цикл будет потреблять 100% ЦП, поскольку он никогда не прекращает что-либо делать. Вы можете поместить sleep(.1) или около того в цикл, чтобы проверять рабочие потоки только часто, а не непрерывно.

1 голос
/ 05 февраля 2010

Этот бит касается меня:

Мой код убеждает, что ни один из них никогда не простаивает

Что именно вы подразумеваете под этим?

Если вы делаете тысячи и тысячи веб-запросов, и если эти запросы возвращаются очень быстро, то может съесть некоторый ЦП.

15 МБ памяти не является неожиданностью, но процессор является более тревожным. Не могли бы вы дать более подробную информацию о рабочей нагрузке, на которую вы это ставите? Что вы подразумеваете под "каждый из них работает примерно полсекунды"?

Что вы подразумеваете под "Я использую обработку исключений как часть моей рутины"? Каким образом и сколько исключений выбрасывается? Если вы работаете в отладчике, то исключения намного дороже, чем если бы вы не отлаживали - если вы выкидываете и ловите много исключений, то может быть ответственным за это ...

0 голосов
/ 21 февраля 2011

Из вашего текста я прочитал, что у вас есть Core 2 Duo. Это 2 темы или 4 темы?

Если у вас есть 2 потока, вы должны использовать только 2 BackGroundworkers одновременно. Если у вас 4 темы, используйте 4 BGW's одновременно. Если у вас больше BGW's, используйте следующее выражение:

System.Threading.Thread.Sleep(1) 

Также используйте Applications.DOevents.

Мой общий совет: начните с простого и медленно делайте свое приложение более сложным.
Взгляните на: Методы параллельного программирования Visual Basic 2010 .

0 голосов
/ 07 февраля 2010

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

...