Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
#1

Sleep - что внутри? - Delphi WinAPI

17.09.2016, 19:54. Просмотров 476. Ответов 3
Метки нет (Все метки)

Цикл
Delphi
1
2
3
repeat
  Sleep(1)
until ...
почти не грузит процессор.
Что там такого зашито внутри? Как это можно реализовать кроме как через Sleep?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2016, 19:54     Sleep - что внутри?
Посмотрите здесь:

Sleep внутри функции - перекрывает выполнение предыдущих строк C++ Builder
Sleep(8000) - что значит? На что можно заменить в борланд с++? C++
C++ Sleep внутри мьютекса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
19.09.2016, 12:55  [ТС]     Sleep - что внутри? #2
Собственно, суть вопроса в том, что я хочу сделать цикл spin-loop, разбавленный (после некоторого безуспешного кол-ва циклов) чем-то, разгружающим процессор, но не слишком долгим. Sleep, честно говоря, мне не очень нравится. Чем его можно заменить?

Добавлено через 1 минуту
К сожалению, pause не разгружает проц вообще никак
Убежденный
Системный программист
Эксперт С++
15173 / 6805 / 1073
Регистрация: 02.05.2013
Сообщений: 11,118
Завершенные тесты: 1
19.09.2016, 13:08     Sleep - что внутри? #3
Можно сделать так: сначала идет несколько "полноценных" spin-циклов,
далее несколько циклов с pause, потом уже Sleep со все возрастающей
(до некоторого значения) задержкой.
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
19.09.2016, 20:28  [ТС]     Sleep - что внутри? #4
Я всё же сделаю так: несколько (1024, скорее всего) полноценных циклов с pause (Intel рекомендует), затем Sleep(1) и всё заново.
И на i5 2500K, и на нетбуке со слабым процем (Atom) такой код с 256 такими потоками грузит проц меньше, чем на 1% (примерно такая же история с 1024 потоками при кол-ве циклов 256)

Добавлено через 56 минут
Даже так: X (скажем, 256) полноценных циклов с pause, затем SwitchToThread. Всё это повторяем Y раз (скажем, 4), затем заменяем SwitchToThread на Sleep(1). И всё заново.
Получается один Sleep(1) на 1024 циклов, но до него ещё 3 SwitchToThread.

SwitchToThread нужны для принудительного переключения потоков, который происходит автоматически довольно редко (раз в 10-15 мс). Т.е. иначе получается, что пока мы ждём 1024 цикла до Sleep(1) на том же ядре всё равно будет работать только этот поток и надеяться нужно либо на автоматическое переключение потоков Windows'ом, либо на то, что другие потоки работают на другом ядре, что не совсем разумно... Слишком частый вызов SwitchToThread делать тоже не стоит, т.к. он тоже грузит процессор.

Добавлено через 3 часа 49 минут
upd:
( ( 265 spin-циклов, затем SwitchToThread ) * 4 раза, затем Sleep(1) ) * 4 раза.
Итого выходит 4096 циклов. Не так много, но и не мало.
После этого переходим на Sleep(1) после каждой проверки, максимально разгружая таким образом проц.
Подобрать только более оптимально цифры надо: 256, 4, 4...
Yandex
Объявления
19.09.2016, 20:28     Sleep - что внутри?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru