尽管存在可变延迟,但每步的平均时间是恒定的

时间:2018-01-15 15:24:10

标签: vba excel-vba timer cellular-automata excel

我在VBA上制作了一个元胞自动机(Langton's ant FYI)。在每个步骤中,都有一个Sleep(delay),其中delay是一个变量。我还在DoEvents函数的末尾添加了display,以确保每个步骤都显示在屏幕上。 使用Timer我可以监控一步平均需要多长时间。结果绘制在下图中(Y轴:每步的时间(以ms为单位).X轴:delay(以ms为单位))

Time per step (in ms) vs <code>delay</code>

你能解释一下为什么会这样吗?特别是为什么它保持稳定?因为IMO,我想(或多或少)有一条直线。 在整个过程中,我在计算机上做了其他任何事情,我得到了这些结果。

提前感谢您的帮助,

1 个答案:

答案 0 :(得分:4)

那是因为Sleep API基于系统时钟。如果您的时钟分辨率低于您正在睡觉的时间,那么它将向上舍入到您系统时钟的最近分辨率。您可以致电timeGetDevCaps查看系统的最低计时器分辨率。

以这种方式思考。你有一个普通的手表,只包括你通常的小时/分钟/秒针(没有手为1/1000等)。你想要时间半秒钟,但你的手表只能以1秒的间隔移动 - 因此你的手表的分辨率是每秒1滴。由于这个分辨率,你不会知道半秒钟已经过去了直到整秒都过去了,所以它会四舍五入到下一个刻度。