Чрезвычайно интенсивный процессор будильник - PullRequest
0 голосов
/ 27 апреля 2010

EDIT:

Я хотел бы поблагодарить вас всех за быстрые ответы ^^ Sleep () работает, как и предполагалось, и мой процессор больше не поглощается этой программой! Я оставлю этот вопрос как есть, но чтобы все знали, что проблема с процессором была решена целесообразно и профессионально: D

Помимо этого, я обязательно позабочусь о том, чтобы микрооптимизации были сведены к минимуму перед лицом более крупных и важных проблем!

=============================================== =================================

По какой-то причине моя программа, консольный будильник, который я сделал для смеха и практики, чрезвычайно загружает процессор. Он потребляет около 2 МБ оперативной памяти, что уже довольно мало для такой маленькой программы, но иногда он опустошает мой процессор с более чем 50% ресурсов.

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

/* The wait function waits exactly one second before returning to the *
 * called function.                                                   */     
 void wait( const int &seconds )
 {
 clock_t endwait; // Type needed to compare with clock()
 endwait = clock() + ( seconds * CLOCKS_PER_SEC ); 

 while( clock() < endwait ) {} // Nothing need be done here.
 }

В случае, если кто-нибудь просматривает CPlusPlus.com, это подлинная функция копирования / вставки функции clock (), которую они написали в качестве примера для clock (). Многое почему комментарий //Nothing need be done here такой тусклый. Я не совсем уверен, что именно часы () делает.

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

Первая функция - очистка консоли с использованием system("cls"), которая, я знаю, действительно очень медленная и не очень хорошая идея. Я буду менять эту поспешность, но, поскольку она активируется только каждые 60 секунд, и наблюдается заметный скачок задержки, я знаю, что это не проблема в большинстве случаев.

Вторая функция перезаписывает содержимое экрана с обновленным оставшимся временем также только каждые шестьдесят секунд.

Я отредактирую функцию, которая вызывает wait, clearScreen и отображает, если ясно, что эта функция не является проблемой. Я уже пытался ссылаться на большинство переменных, чтобы они не копировались, а также избегать endl, так как я слышал, что это немного медленнее по сравнению с \n.

Ответы [ 6 ]

15 голосов
/ 27 апреля 2010

Это:

while( clock() < endwait ) {} 

Не "ничего не делает". Конечно, ничего не делается внутри цикла while, но тест clock() < endwait не является бесплатным. Фактически, он выполняется снова и снова так быстро, насколько ваша система может справиться с этим, что и увеличивает вашу нагрузку (вероятно, на 50%, потому что у вас двухъядерный процессор, и это однопоточная программа который может использовать только одно ядро).

Правильный способ сделать это - просто удалить всю эту wait функцию и вместо этого просто использовать:

sleep(seconds);

Который фактически остановит выполнение вашей программы в течение указанного количества секунд и не потребляет никакого процессорного времени при этом.

В зависимости от вашей платформы для доступа к этой функции вам потребуется включить либо <unistd.h> (UNIX и Linux), либо <windows.h> (Windows).

6 голосов
/ 27 апреля 2010

Это называется занятым ожиданием. Процессор вращает свои колеса на полную мощность в цикле while. Вам следует заменить цикл while простым вызовом sleep или usleep.

Я не знаю о 2 МБ, особенно не зная ничего об общей программе, но на самом деле это не то, на чем можно было бы подчеркнуть. Вполне возможно, что библиотеки времени выполнения C сильно нагружаются при запуске из соображений эффективности.

3 голосов
/ 27 апреля 2010

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

Запустите и проверьте программу, которая просто содержит

int main() { for (;;) }

, чтобы измерить базовое использование памяти на вашей платформе.

2 голосов
/ 27 апреля 2010

Цикл while поддерживает занятость процессора всякий раз, когда ваш поток получает выполнение временного интервала. Если все, что вы хотите, это ждать определенное количество времени, вам не нужен цикл. Вы можете заменить его одним вызовом sleep, usleep или nanosleep (в зависимости от платформы и степени детализации). Они приостанавливают выполнение потока до тех пор, пока не истечет указанное вами время.

В качестве альтернативы, вы можете просто отказаться (сдаться) на оставшемся временном интервале, вызвав Sleep(0) (Windows) или sched_yield() (Unix / Linux / etc).

Если вы хотите понять точную причину этой проблемы, прочитайте о планирование .

2 голосов
/ 27 апреля 2010

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

Бросай

  Sleep(50);

в цикле while.

1 голос
/ 27 апреля 2010

while (clock ()

...