我知道时钟周期因操作系统和设置而异。如果我正在编写想要相对自信(至少95%肯定)睡眠的代码,那么我可以用于睡眠的最短时间是什么,并且确信运行代码的任何计算机/操作系统都会睡眠?
是否有办法让至少一个时钟周期的睡眠成为可能?不管这个循环在java中有多长?
答案 0 :(得分:1)
你永远不应该尝试这样做。问问自己是否真的需要睡一个时钟周期。将计时器与计时器联系起来总是一个糟糕的决定。下面我给你几个选择。
许多lib已经实现了fps的概念。通常它们的实现已经抽象出每秒钟数和操作系统限制/细节。您可以使用该概念并与平台无关。
通过这种方式,您可以使用更多或更少的fps来调整您的时间要求。
为什么你需要睡一个周期?这是一个非常短的时间。您可以尝试使用互斥锁而不是计时器来同步(如果是这种情况)。
此外,互斥锁通常由硬件指令实现。这样可以保证它们是原子的。如果你确实需要无限时间睡眠,你可以锁定互斥锁然后解锁它。老实说,根据定义,您执行的任何代码(除非是NOOP)类似于一个周期的睡眠。您也可以使用tmp = 1+1
。这需要两个指令。
我建议使用互斥锁。从你的问题来看,不清楚为什么你需要那个睡眠时间。
如果您需要等待用户交互(或任何外部事件,如请求),请锁定互斥锁,并仅在事件或用户输入可用时将其解锁。
如果你真的想走下计时器之路,我建议你实现一个执行long for循环的例程,然后你可以尝试从执行for循环所需的时间派生你的计时器。
正如我之前所说,我不认为这种方法是可靠的,但这是有道理的。此外,我建议您使用蒙特卡罗可靠性技术和单元测试的混合来保护此代码。您可以在this article上了解详情。
作为最后一点,请注意编译器/解释器可以进行的优化并拧紧计时器。