Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2016, 14:25   #11
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Если определять по системным часам, то Sleep(1) выполнится быстрее одного тика часов (насколько быстрее не совсем ясно), а Sleep(50) может выполниться менее чем за 50 мс, если сон начался прямо перед тиком часов; или же может выполняться чуть дольше, если уйдёт в сон сразу после тика. При ста итерациях можно предположить что 50 раз Sleep выполнялся чуть медленнее и 50 раз чуть быстрее, в среднем всё нормально, отсюда и высокая точность.
eoln вне форума Ответить с цитированием
Старый 18.09.2016, 14:52   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Да задавали уже этот вопрос, вот он. "Читаем, просвещаемся..." (с)
Человек_Борща вне форума Ответить с цитированием
Старый 19.09.2016, 12:47   #13
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
активное ожидание всегда грузит.

Критсекция все же для защиты ресурса, а не для ожидания.
Так, поэтому я и хочу разбавить чем-то разгружающим. Только не на 15 мс и не Sleep'ом (не нравится он мне), а на более короткий срок.

Крит.секция - для защиты ресурса, но чтобы войти в неё, иногда нужно подождать. А иногда долго (правда, ИМХО, некорректно делать такие длинные секции, но всё же можно).
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 19.09.2016, 12:55   #14
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

К сожалению, pause не разгружает проц вообще никак
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 19.09.2016, 13:06   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну так и ждите нормальной критсекцией или в ядре ивентом, не надо опрашивать постоянно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2016, 14:00   #16
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Только не на 15 мс и не Sleep'ом (не нравится он мне), а на более короткий срок.
Sleep это стандартный метод. Да другого видимо нет. Если только вы сделаете или найдёте системные событие с большей частотой.

Переключение контекстов занимает порядка 1-10 мкс.
Так что мьютекс стоит делать на спинлоке длиною в 1 000 кругов. Далее Sleep(0) или если sleep не нравиться, то SwitchToThread; - тоже в цикле 1 000 раз. А далее уже имеет смысл разгружать процессор через Sleep(1).

Что касается времени срабатывания Sleep то оно зависит от загруженности процессора. И может достаточно сильно плавать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 14:20   #17
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну так и ждите нормальной критсекцией или в ядре ивентом, не надо опрашивать постоянно.
Pavia, я так понимаю, SwitchToThread делает то же самое, что и Sleep(0), правильно?
Только вопрос: почему 1 раз на 1000 циклов Sleep(0), а не Sleep(1). И когда тогда делать Sleep(1) ?
Sleep(1) , по идее, должен SwitchToThread вызвать тоже...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 19.09.2016, 14:29   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Sleep - всегда прерывает исполнение(оно будет возвращено по истечению таймаута)
SwitchToThread - прерывает исполнение только если нужно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2016, 15:20   #19
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
SwitchToThread делает то же самое, что и Sleep(0), правильно?
По результату замеров да.

Цитата:
Только вопрос: почему 1 раз на 1000 циклов Sleep(0), а не Sleep(1). И когда тогда делать Sleep(1) ?
Думаю что это будет оптимальнее, хотя и не всегда. С начало 1000 раз Sleep(0), а потом уже Sleep(1).
Sleep(0)- нужен для микросекунд. Вернее мы сможем выиграть в производительности на микросекундном диапазоне. Процессор это не разгрузит, а вот производительности добавит. А вот Sleep(1) уже разгрузит процессор.

За счёт чего выигрыш?
Принудительно смена потоков происходит раз 10-250 мс. В некоторых случаях 1 мс.
Первый поток ждет пока второй поток завершит работу, а второй поток не работает так как квант времени занят первым. Поэтому мы должны сами спровоцировать переключения контекстов иначе так мы будем ждать минимум 10 мс! До принудительного переключения. Что очень долго.

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

Я создал 10 потоков и у каждого в цикле написал Sleep(0) потом поменял на SwitchToThread. Результат аналогичен Process Explorer показал 5 милионов переключений на 8 поточном процессоре. 1,6 мкс на переключение.
А если сделать sleep(1) то от 300 до 1000 раз. Как видите разница на 3 порядка!
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 16:31   #20
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Pavia, так оно и понятно, что будет на 3 порядка меньше. Ведь Sleep(1) делает ещё и задержку.

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

Я потестил этот механизм. И на i5 2500K, и на нетбуке со слабым процем (Atom) такой код с 256 потоками грузит проц меньше, чем на 1% (примерно такая же история с 1024 потоками при кол-ве циклов до Sleep(1) 32*4=256).
p.s. Слишком частый вызов SwitchToThread тоже добавляет загрузки процу. Например 32*32 будет уже грузит i5 на 40-50% (256 потоков).

upd:
( ( 265 spin-циклов, затем SwitchToThread ) * 4 раза, затем Sleep(1) ) * 4 раза.
Итого выходит 4096 циклов. Не так много, но и не мало.
После этого переходим на Sleep(1) после каждой проверки, максимально разгружая таким образом проц.
Подобрать только более оптимально цифры надо: 256, 4, 4...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 19.09.2016 в 18:50.
7in вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как доказать, что точка лежит внутри многоугольника? NikiToZz_ Паскаль, Turbo Pascal, PascalABC.NET 7 19.06.2016 12:16
Показывается, что часть диска занята, а внутри - Эта папка пуста keen_ Операционные системы общие вопросы 11 15.10.2012 11:54
Обработка одномерных массивов, СИ. задание внутри, и написанный мною текст программы тоже внутри. кое-что нужно исправить.. Амелия Общие вопросы C/C++ 6 02.04.2012 20:03
moc_mainwindow, а что внутри? Farrel Qt и кроссплатформенное программирование С/С++ 3 09.06.2011 16:03
код проги внутри, что там не так??? Gula1706 Общие вопросы C/C++ 1 18.12.2010 00:27