V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
596164296
V2EX  ›  Python

Python 调用 win32api 时间问题,自认为属于高阶问题

  •  
  •   596164296 · 2021-07-27 16:42:30 +08:00 · 1886 次点击
    这是一个创建于 975 天前的主题,其中的信息可能已经有所发展或是发生改变。
    源代码如下:
    import win32api
    import win32con
    import win32gui
    import win32ui
    1 win32api.SetCursorPos((click_x, click_y))
    2 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0x1, 0, 0, 0)
    3 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0x1, 0, 0, 0)
    4 win32api.SetCursorPos((click_x, click_y))
    5 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0x1, 0, 0, 0)
    6 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0x1, 0, 0, 0)
    7 win32api.SetCursorPos((click_x, click_y))
    8 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0x1, 0, 0, 0)
    9 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0x1, 0, 0, 0)
    上述代码在运行过程中有个奇怪现象,有的时候运行需要 22ms 左右,有的时候却只要 8ms 左右,是什么问题造成如此结果,正常情况下应该都是一样的吧,我将此程序在 windows 系统中的执行优先级设为“实时”,出现 22ms 的次数更多。

    望有懂得技术大哥帮助小弟解开这个疑惑(不要告诉我百度,百度了没结果)
    6 条回复    2021-07-28 12:01:44 +08:00
    3dwelcome
        1
    3dwelcome  
       2021-07-27 17:00:29 +08:00
    你有没有想过,为什么刚好是 22ms,而不是 21ms 或者 23ms?

    答案就是测量用时 API 精度的问题。

    WinAPI 运行耗时都差不多的。
    596164296
        2
    596164296  
    OP
       2021-07-27 17:06:18 +08:00
    @3dwelcome 感谢你的回复,我用的统计时间的语句为:int(round(time.time() * 1000)),精确到毫秒,我在多次测试中发现,是 22ms 左右,并不是总是 22ms,有 5ms 、7ms 、8ms 、9ms 、12ms 、15ms 、17ms 、21ms 、22ms 、25ms 甚至三十几 ms 都有,并且该代码在性能越好的电脑上时间越短,并且我之前用 c 语言测试过(很久之前了),同样是这样的情况,如果有更好的测量时间的方法,望提示,我将去试一试
    3dwelcome
        3
    3dwelcome  
       2021-07-27 17:12:30 +08:00
    用这个 API

    https://docs.microsoft.com/zh-cn/windows/win32/sysinfo/acquiring-high-resolution-time-stamps

    我实际用下来的经验是,先别说需要测量的 API,光这个 Win32 查询时间函数,自己调用也挺费周期数的。
    xupefei
        4
    xupefei  
       2021-07-27 17:16:37 +08:00 via iPhone
    billlee
        5
    billlee  
       2021-07-27 21:12:53 +08:00
    还不知道你在干什么,windows 是个多任务抢占式调度的操作系统,正常情况下花的时间就是不一样
    nuk
        6
    nuk  
       2021-07-28 12:01:44 +08:00
    应该是等队列里的消息被 poll 吧,你把屏幕的刷新率调整一下看看时间是不是会变。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1141 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 18:37 · PVG 02:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.