Как я могу программно ограничить использование ЦП своей программы ниже 70%?

Хотя можно утверждать, что, поскольку это не переполнение буфера или какая-либо другая ошибка, которая может быть использована, это вещь в стиле , а не ошибка, я уверен на 99%, что ответ автор вопроса ищет, чтобы value оперировали до того, как ему присвоили. Значение будет произвольным мусором, и вряд ли это будет то, что имелось в виду, так что это «потенциально неправильно».

44
задан Shog9 26 June 2009 в 13:15
поделиться

7 ответов

Это не ваша забота ... Задача операционной системы - распределять время процессора между запущенными процессами. Если вы хотите, чтобы другие процессы сначала взялись за выполнение своих задач, просто уменьшите приоритет своего процесса, изменив для него значение Process.PriorityClass .

См. Также: ] Windows Эквивалент 'nice'

30
ответ дан 26 November 2019 в 21:38
поделиться

Если ваш код вообще запущен, то он на 100%

Я полагаю, что некоторые сны могут иметь эффект.

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

2
ответ дан 26 November 2019 в 21:38
поделиться

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

1
ответ дан 26 November 2019 в 21:38
поделиться

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

2
ответ дан 26 November 2019 в 21:38
поделиться

Я думаю, что вам нужно понять проблему производительности в вашем приложении, вместо того, чтобы пытаться ограничить использование ЦП. Вы можете использовать Visual Studio Profiler, чтобы понять, почему ваше приложение в первую очередь загружает процессор на 100% в течение 2-3 минут. Это должно выявить «горячую точку» в вашем приложении, и тогда вы сможете решить эту проблему.

Если вы спрашиваете в целом о том, как выполнять регулирование ресурсов в Windows, то вы можете посмотреть на объекты «Задача», Объекты задания позволяют вам устанавливать ограничения, такие как рабочий набор, приоритет процесса ... и т. Д.

Вы можете проверить документацию по объектам задания здесь http://msdn.microsoft.com/en-ca/library/ms684161 (VS.85) .aspx Надеюсь это поможет. Спасибо

-1
ответ дан 26 November 2019 в 21:38
поделиться

Если нет других запущенных задач, неправильно ли для вашего приложения использовать всю доступную емкость процессора? Он доступен , как и в , и его можно использовать бесплатно . Так что используйте его!

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

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

-1
ответ дан 26 November 2019 в 21:38
поделиться

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

Вот простая реализация Java, пришедшая мне в голову (просто чтобы вы поймите идею), который снизит использование ЦП до 50%, если у вас есть однопоточная функция, привязанная к ЦП.

public class Governor
{
  long start_time;

  public Governor()
  {
    this.start_time = System.currentTimeMillis();
  }

  public void throttle()
  {
    long time_elapsed = System.currentTimeMillis() - this.start_time;

    if (time_elapsed > 100) //throttle whenever at least a 100 millis of work has been done
    {
      try { Thread.sleep(time_elapsed); } catch (InterruptedExceptione ie) {} //sleep the same amount of time

      this.start_time = System.currentTimeMillis(); //reset after sleeping.
    }
  }
}

Ваша функция, привязанная к ЦП, создаст экземпляр Губернатор , а затем просто вызовет throttle на регулярной основе в рамках функции.

15
ответ дан 26 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: