Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Оптимизация бесконечного цикла

#cpp #циклы #оптимизация


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

while(true) {
    test();
} 


отнимает львиную долю мощности процессора (в моём случае 30%). Для решения этой проблемы
я после каждого такта цикла даю ему поспать на пару миллисекунд 

while(true) {
    test();
    this_thread::sleep_for(chrono::milliseconds(50));
}


Благодаря этому нагрузка снижается до ~0.5% при отсутствие новых сообщений, и до
~8% при пиковой нагрузке.

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

float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time = time/700;


и последующим умножением time на скорость игры.

Мой вариант со спячкой меня более чем устраивает, но все равно хочу знать

"А можно сделать лучше?"
    


Ответы

Ответ 1



В много-поточной задаче нормальным является использование объектов синхронизации. В данном контексте вечный цикл не должен выполняться вообще. Поток должен всегда находиться в режиме ожидания. И выполняться только если это позволит объект синхронизации. Что то вроде этого: while(true) { wait(lock); test(); }

Комментариев нет:

Отправить комментарий