尽管延迟可变,但每步的平均时间是恒定的
Average time per step is constant despite a variable delay
我在 VBA 上制作了一个元胞自动机(Langton 的蚂蚁 FYI)。在每个步骤中,都有一个 Sleep(delay)
,其中 delay
是一个变量。我还在 display
函数的末尾添加了 DoEvents
以确保每个步骤都显示在屏幕上。
使用 Timer
我可以监控一步平均需要多长时间。结果绘制在下面的图表上(Y 轴:每步时间(以毫秒为单位)。X 轴:delay
(以毫秒为单位))
你能解释一下为什么它看起来像那样吗?特别是为什么它保持稳定?因为 IMO,我想(或多或少)有一条直线。
在整个过程中,我没有在计算机上执行任何其他操作就得到了这些结果。
提前感谢您的帮助,
那是因为 Sleep API
是基于系统时钟的。如果您的时钟分辨率低于您的睡眠时间,那么它将四舍五入为最接近您的系统时钟的分辨率。您可以调用 timeGetDevCaps
查看系统的最小计时器分辨率。
这样想。你有一个普通的手表,只包括你常用的 Hour/Minute/Second 指针(1/1000 没有指针,等等)。您想要计时半秒,但您的手表仅以 1 秒为间隔移动 - 因此您手表的分辨率为每秒 1 刻度。由于这个分辨率,你不会知道半秒实际上已经过去了,直到整秒过去,所以它四舍五入到下一个刻度。
我在 VBA 上制作了一个元胞自动机(Langton 的蚂蚁 FYI)。在每个步骤中,都有一个 Sleep(delay)
,其中 delay
是一个变量。我还在 display
函数的末尾添加了 DoEvents
以确保每个步骤都显示在屏幕上。
使用 Timer
我可以监控一步平均需要多长时间。结果绘制在下面的图表上(Y 轴:每步时间(以毫秒为单位)。X 轴:delay
(以毫秒为单位))
你能解释一下为什么它看起来像那样吗?特别是为什么它保持稳定?因为 IMO,我想(或多或少)有一条直线。 在整个过程中,我没有在计算机上执行任何其他操作就得到了这些结果。
提前感谢您的帮助,
那是因为 Sleep API
是基于系统时钟的。如果您的时钟分辨率低于您的睡眠时间,那么它将四舍五入为最接近您的系统时钟的分辨率。您可以调用 timeGetDevCaps
查看系统的最小计时器分辨率。
这样想。你有一个普通的手表,只包括你常用的 Hour/Minute/Second 指针(1/1000 没有指针,等等)。您想要计时半秒,但您的手表仅以 1 秒为间隔移动 - 因此您手表的分辨率为每秒 1 刻度。由于这个分辨率,你不会知道半秒实际上已经过去了,直到整秒过去,所以它四舍五入到下一个刻度。