Почему пустой цикл использует так много процессорного времени?

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

Это не показывает список ошибок так, чтобы я мог быстро перейти им.

Ошибки отмечаются в окне редактирования, в то время как Вы редактируете. Можно зафиксировать их на месте, не имея необходимость "переходить" где угодно.

, Если Вы бросаете весь исходный файл в свой проект, Вы не можете быть в окне редактирования на том файле. (И, конечно, это не стандартное использование Eclipse.) Самый простой способ, которым я знаю, заключает, сделка с этим должна просто "Обновить" проект и взгляд в представлении Package Explorer, чтобы видеть, существуют ли какие-либо обнаруженные ошибки (который сразу произойдет, если Вы "обновляете" файл в исходную папку). Дважды щелкните по любым файлам, которые показывают значок ошибки и смотрят на правую сторону окна редактирования для наблюдения точно, где ошибки.

я знаю, что существует представление "Problems", которое показывает список проблем (и не только ошибки компилятора) во всех проектах и не конкретном проекте, что я работаю с...

, Если Вы не используете несколько проектов с зависимостями межпроекта, я нахожу полезным закрыть всех кроме текущего проекта, над которым я работаю. Тогда представление "Problems" характерно для текущего контекста.

Наконец, я рекомендовал бы смотреть страница "начала работы" Mylin для других подсказок о том, как Eclipse может помочь Вам сфокусироваться на текущей задаче.

13
задан Community 23 May 2017 в 10:32
поделиться

12 ответов

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

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

36
ответ дан 1 December 2019 в 17:12
поделиться

I am going to guess that you have four cores on your multicore processor, which would explain the 25%, as you are completely tying up one processor doing your busy loop, as the only break in it is when the application is delayed so another application can run (but that may not happen depending on the load).

When you put a thread to sleep then it allows the OS to do other operations, and it knows when, as a minimum, to come back and wake up the thread, so it can continue it's work.

20
ответ дан 1 December 2019 в 17:12
поделиться

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

7
ответ дан 1 December 2019 в 17:12
поделиться

У вас четырехъядерный компьютер, верно? Если так, то

while(true);

на самом деле использует 100% одного из ваших ядер.

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

Sleep(1);

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

7
ответ дан 1 December 2019 в 17:12
поделиться

Sleep () на самом деле ничего не делает в то время, когда поток находится в спящем режиме. Он передает свое время другим процессам. С другой стороны, цикл постоянно проверяет, является ли условие истинным или ложным.

1
ответ дан 1 December 2019 в 17:12
поделиться

По сути, у вас есть несколько состояний «планировщика процессов». Назову троих из них. Один: готов Два: Бег Three: Blocked

These states / queues only exist because of the limited number of cores on your processor. In Ready, processes are scheduled that are totally ready for execution. They don't have to wait for input, time, or whatever. On Running, processes actually "have" the processor and thus ARE running. State Blocked means your process is waiting for an event to happen before queueing for the processor.

When you keep on testing for while(true) you keep your process in the "ready" queue. Your process scheduler gives it a certain amount of time, and after a while, removes it from the processor (placing it on the back of the "ready" queue). And thus your process will keep coming back "on" the processor, keeping it busy.

When you execute a "sleep" statement, your process will not be scheduled on process until the prerequisity is fulfilled - in this particular case, as long as the time passed after the "sleep" command <= 1000 ms.

2
ответ дан 1 December 2019 в 17:12
поделиться

Пустой цикл на самом деле не пустой. Сам по себе цикл - это как минимум сравнение и возврат к сравнению. Современные процессоры могут выполнять миллионы этих операций в секунду.

Оператор сна во втором цикле передает управление операционной системе как минимум на 1 миллисекунду. В этом состоянии приложение фактически останавливается и не продолжает обработку. Результат остановки на время x уменьшает количество сравнений и, следовательно,% тактовых циклов процессора, которые он может выполнять в секунду.

Что касается 25%, то процессоры Intel, поддерживающие Hyperthreading или многоядерные процессоры, могут испортить статистика производительности. Пустой цикл фактически заполняет по крайней мере одно ядро ​​процессора.

В те времена, когда многоядерных процессоров не существовало, у пользователей действительно была потребность в многократной обработке / выполнении задач. Есть несколько способов добиться иллюзии одновременного запуска нескольких процессов.

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

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

Есть несколько способов добиться иллюзии одновременного запуска нескольких процессов.

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

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

Есть несколько способов добиться иллюзии одновременного запуска нескольких процессов.

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

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

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

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

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

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

Так было в старых версиях Windows. Если данное приложение было плохо спроектировано так, чтобы оно не теряло контроль или застревало в бесконечном цикле, весь ваш компьютер фактически зависал.

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

Так было в старых версиях Windows. Если данное приложение было плохо спроектировано так, чтобы оно не теряло контроль или застревало в бесконечном цикле, весь ваш компьютер фактически зависал.

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

7
ответ дан 1 December 2019 в 17:12
поделиться

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

0
ответ дан 1 December 2019 в 17:12
поделиться

The sleep in the second one is kinda like a 'yield' to the OS's process scheduler.

0
ответ дан 1 December 2019 в 17:12
поделиться

Потому что вы заставляете процессор быть занятым повторением и повторением цикла.

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

0
ответ дан 1 December 2019 в 17:12
поделиться

ЦП может выполнять несколько миллиардов операций в секунду. Это означает, что пустой цикл выполняется mybe один миллион раз в секунду. Цикл с оператором сна выполняется только 1000 раз в секунду. В этом случае у процессора есть несколько операций в секунду, чтобы делать другие вещи.

Допустим, у нас есть процессор с частотой 3 ГГц. 3Ghz = 3 000 000 000 Гц - ЦП может запускать цикл три миллиарда раз в секунду (упрощенно).

С оператором ожидания цикл выполняется 1000 раз в секунду. Это означает, что загрузка процессора составляет

1000/3 000 000 000 * 100 = 0,0001%

0
ответ дан 1 December 2019 в 17:12
поделиться

Потому что это будет выполнять инструкции все время.

Нормальные программы не могут безумно выполнять инструкции все время.

Например, программы с графическим интерфейсом пользователя просто ждут событий, ( например, ввод с клавиатуры),

Примечание: бездействие! = while (true);

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

Вот почему обычные процессы не занимают столько ресурсов процессора.

Итак, ранее я сказал, что бездействие - это не то же самое, что бесконечное пустой цикл. Это почему? Сидеть без дела означает сказать ОС, что вам нечего запускать.

Бесконечные циклы на самом деле - это то, что нужно запускать (повторяющаяся инструкция перехода).

С другой стороны, отсутствие работы означает, что ОС даже не потрудится предоставить вам процессорное время, даже если придет ваша очередь.

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

Еще один экземпляр простаивающего процесса - это Sleep (1) , здесь он явно сообщает ОС не давать ему время процессора до истечения указанного времени.

Я даже не удосужился предоставить вам какое-либо процессорное время, даже если это ваша очередь.

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

Еще один экземпляр простаивающего процесса - Sleep (1) , здесь он явно сообщает ОС не давать ему время процессора до истечения указанного времени.

Я даже не удосужился дать вам какое-либо процессорное время, даже если это ваша очередь.

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

Еще один экземпляр простаивающего процесса - Sleep (1) , здесь он явно сообщает ОС не давать ему время ЦП до истечения указанного времени.

0
ответ дан 1 December 2019 в 17:12
поделиться