python中调整时钟实现高精度计时时的系统开销考量~

在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以下的影响还是很大的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happybasic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值