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

2021-07-27 16:42:30 +08:00
 596164296
源代码如下:
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 的次数更多。

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

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

WinAPI 运行耗时都差不多的。
596164296
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
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
2021-07-27 17:16:37 +08:00
billlee
2021-07-27 21:12:53 +08:00
还不知道你在干什么,windows 是个多任务抢占式调度的操作系统,正常情况下花的时间就是不一样
nuk
2021-07-28 12:01:44 +08:00
应该是等队列里的消息被 poll 吧,你把屏幕的刷新率调整一下看看时间是不是会变。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX