![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
![]()
Если определять по системным часам, то Sleep(1) выполнится быстрее одного тика часов (насколько быстрее не совсем ясно), а Sleep(50) может выполниться менее чем за 50 мс, если сон начался прямо перед тиком часов; или же может выполняться чуть дольше, если уйдёт в сон сразу после тика. При ста итерациях можно предположить что 50 раз Sleep выполнялся чуть медленнее и 50 раз чуть быстрее, в среднем всё нормально, отсюда и высокая точность.
|
![]() |
![]() |
![]() |
#13 | |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]() Цитата:
Крит.секция - для защиты ресурса, но чтобы войти в неё, иногда нужно подождать. А иногда долго (правда, ИМХО, некорректно делать такие длинные секции, но всё же можно).
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|
|
![]() |
![]() |
![]() |
#14 |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]()
К сожалению, pause не разгружает проц вообще никак
![]()
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
ну так и ждите нормальной критсекцией или в ядре ивентом, не надо опрашивать постоянно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#16 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]() Цитата:
Переключение контекстов занимает порядка 1-10 мкс. Так что мьютекс стоит делать на спинлоке длиною в 1 000 кругов. Далее Sleep(0) или если sleep не нравиться, то SwitchToThread; - тоже в цикле 1 000 раз. А далее уже имеет смысл разгружать процессор через Sleep(1). Что касается времени срабатывания Sleep то оно зависит от загруженности процессора. И может достаточно сильно плавать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
![]() |
![]() |
![]() |
#17 | |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]() Цитата:
Только вопрос: почему 1 раз на 1000 циклов Sleep(0), а не Sleep(1). И когда тогда делать Sleep(1) ? Sleep(1) , по идее, должен SwitchToThread вызвать тоже...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
|
|
![]() |
![]() |
![]() |
#18 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
Sleep - всегда прерывает исполнение(оно будет возвращено по истечению таймаута)
SwitchToThread - прерывает исполнение только если нужно. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#19 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]() Цитата:
Цитата:
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 порядка!
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
![]() |
![]() |
![]() |
#20 |
(aka Jin X) !RTFM!
Форумчанин
Регистрация: 14.12.2014
Сообщений: 296
|
![]()
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. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как доказать, что точка лежит внутри многоугольника? | 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 |