Фоновый сон, чтобы уменьшить процессор - PullRequest
5 голосов
/ 27 ноября 2011

У меня есть задача, которую я хочу выполнять снова и снова. Я хочу назвать это как можно быстрее, но я хочу, чтобы количество циклов процессора оставалось низким. Я читал, что использование сна в фоновом режиме не лучший выбор. Однако без сна мой процессор остается на 55%. У меня есть пример моего источника ниже. Если вам подходит сон, как вы выбираете лучшее время для сна, как вы можете видеть из моих результатов ниже, я получаю разные результаты в зависимости от того, как долго я сплю. Может кто-нибудь дать мне знать, что лучше всего делать, когда что-то похожее

BackgroundWorker _Worker = new BackgroundWorker()
{
  WorkerReportsProgress = true,
  WorkerSupportsCancellation = true
};

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    // do my task here

    // if i uncomment one of the Sleep below I reduce the CPU like so
    // no sleep             CPU = 52-58%
    // Thread.Sleep(1);     CPU = 09-15%
    // Thread.Sleep(10);    CPU = 02-03%
    // Thread.Sleep(100);   CPU = 00-01%
}

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled) { return; }

    _Worker.RunWorkerAsync();
}

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

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

1 голос
/ 27 ноября 2011

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

Но проблема с BackgroundWorker в том, что вы не можете установить приоритет.

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

Вот еще один связанный пост SO:

.NET Threadwork Object Priority

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

Как запустить процесс с низким приоритетом?C #

0 голосов
/ 27 ноября 2011

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

Чего вы, на самом деле, 1004 * пытаетесь достичь?

...