#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(); }
Комментариев нет:
Отправить комментарий