在python中,我们经常会用到time.sleep来做延时,但是由于系统默认时钟是64Hz,也就是延时精度为15.625ms,有很多情况下达到我们的需求,所以我们可以通过修改系统时间实现高精度计时,以下以1ms精度为例:
winmm.timeBeginPeriod(1)
time.sleep(delay_ms / 1000.0)
winmm.timeEndPeriod(1)
如此,我们修改 delay_ms的值就可以实现ms级计时。不过由于此方法用winmm.timeBeginPeriod和winmm.timeEndPeriod两个函数修改和恢复时钟,它们也会带来一些额外的系统开销~
它们带来的系统开销究竟有多大呢?我们不妨来测试一下(代码如下):
import time
import win32api
from ctypes import windll
def measure_overhead(delay_ms, iterations=1000):
"""实际测量开销"""
start_time = time.perf_counter()
for _ in range(iterations):
winmm.timeBeginPeriod(1)
time.sleep(delay_ms / 1000.0)
winmm.timeEndPeriod(1)
end_time = time.perf_counter()
total_time = (end_time - start_time) * 1000 # 转换为毫秒
# 理想情况下只休眠的总时间
ideal_sleep_time = iterations * delay_ms
# 额外开销时间
overhead_time = total_time - ideal_sleep_time
# 开销比率
overhead_ratio = overhead_time / total_time if total_time > 0 else 0
return overhead_ratio, total_time
winmm = windll.winmm
# 实际测量
print("实际测量结果:")
for delay in [1, 2, 5, 10, 20, 50]:
ratio, total = measure_overhead(delay, 100)
print(f"{delay}ms: {ratio:.1%} (总时间: {total:.1f}ms)")
我们可以运行一下看看(以100次循环为例):
实际测量结果:
1ms: 40.9% (总时间: 169.1ms)
2ms: 15.9% (总时间: 237.8ms)
5ms: 9.2% (总时间: 550.9ms)
10ms: 4.3% (总时间: 1044.8ms)
20ms: 2.5% (总时间: 2050.6ms)
50ms: 1.0% (总时间: 5048.9ms)
以上是我用thinkpad x1 i7-1165g7跑出来的结果,可以看出5ms以下的影响还是很大的。

被折叠的 条评论
为什么被折叠?



