Минимальное время сна, чтобы обеспечить сон независимо от тактового цикла?

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

Есть ли способ обеспечить сон хотя бы одного «тактового цикла» независимо от того, как долго этот цикл длится в java?


person dsollen    schedule 24.09.2015    source источник
comment
Thread.sleep гарантирует сон в течение минимум указанного времени (за исключением ложных пробуждений). Просто не гарантируется сон только так долго. Общее эмпирическое правило заключается в том, что гранулярность составляет около 15 мс.   -  person Boris the Spider    schedule 24.09.2015
comment
@BoristheSpider Разве ложные пробуждения не случаются только с wait()?   -  person Cinnam    schedule 24.09.2015
comment
Во-первых, что именно вы подразумеваете под сном? Непонятно, что вы хотите гарантировать. Во-вторых, было бы чрезвычайно полезно понять вашу цель здесь.   -  person David Schwartz    schedule 24.09.2015
comment
Я согласен с тем, что сказал @DavidSchwartz. Если вы хотите спать как можно меньше времени, то почему бы не спать(0)? В самом деле, зачем вообще спать? Если вы думаете, что вам нужно спать(), то весьма вероятно, что вы либо заново изобретаете колесо (например, ScheduledThreadPoolExecutor, javax.swing.Timer,...), либо совершаете ошибку.   -  person Solomon Slow    schedule 24.09.2015


Ответы (1)


Вы никогда не должны пытаться сделать это. Спросите себя, действительно ли вам нужно спать один такт. Связывание реализации с таймерами — всегда плохое решение. Ниже я даю вам несколько альтернатив.

Использовать механизм аналогичный fps в реализации игр

В ряде библиотек уже реализована концепция fps. Обычно их реализация уже абстрагируется от часов в секунду и ограничений/деталей ОС. Вы можете использовать эту концепцию и не зависеть от платформы.

Таким образом, вы можете настроить требования к времени, используя большее или меньшее количество кадров в секунду.

Используйте мьютекс.

Почему нужно спать один цикл? Это очень маленький срок. Вы можете попытаться синхронизировать (если это так), используя мьютексы вместо таймеров.

Кроме того, мьютексы обычно реализуются аппаратными инструкциями. Так что это гарантирует, что они атомарны. Если вам действительно нужно спать в течение бесконечно малого времени, вы можете заблокировать мьютекс, а затем разблокировать его. Честно говоря, любой код, который вы выполняете, по определению (если это не NOOP) будет подобен спящему на один цикл. Вы также можете использовать tmp = 1+1. Это требует двух инструкций.

Я предлагаю мьютекс. Из вашего вопроса непонятно, зачем вам это время сна.

Mutex с взаимодействием с пользователем

Если вам нужно дождаться взаимодействия с пользователем (или любого внешнего события, например запросов), заблокируйте мьютекс и разблокируйте его только тогда, когда событие или пользовательский ввод станет доступным.

Получить значение таймера

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

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

И последнее замечание: остерегайтесь оптимизаций, которые может сделать компилятор/интерпретатор, и испортите свой таймер.

person cenouro    schedule 24.09.2015