为什么通过AppleScript检索最前面的过程需要这么长时间?

时间:2011-07-30 14:11:31

标签: process applescript delay lag

我最近编写了一个名为WindowTiler的实用程序,它使用全局快捷方式在当前聚焦的窗口中移动。我通过AppleScript在窗口移动并使用以下脚本获取焦点窗口的边界

tell application "System Events"
  set appName to the first process whose frontmost is true
  set appWindow to the value of attribute "AXFocusedWindow" of appName
  set {w, h} to the size of appWindow
  set {x, y} to the position of appWindow
  set appBounds to {x, y, x + w, y + h}
end tell
{bounds:appBounds}

随着时间的推移,我意识到如果不及时使用,我的应用程序会慢慢地做出反应。在密集测量时间性能后,我发现所显示的AppleScript的第二行是导致响应缓慢的原因。有时脚本需要一秒钟才能执行(在SSD上,据我所知,在HDD上更糟糕)。

我不知道为什么AppleScript需要这么长时间来查找最前面的流程 - 应该是对流程管理器的唯一请求。也许你知道为什么它如此缓慢和/或能告诉我一种使脚本更快的方法。

PS:当我创建我的应用程序(“存档”)时,我将Xcode配置为预编译我的AppleScripts。编译后的脚本是只读的。

1 个答案:

答案 0 :(得分:0)

我没有看到接收基于碳的事件热键的这种滞后。您是否已将代码添加到代码中以查看何时调用热键回调?这实际上需要几秒钟,或者您可能需要几秒钟来处理它?<​​/ p>

请查看DDHotKey以获取有关如何做到这一点的示例(或者您可能只想使用Dave's代码替换您的代码。)

修改

如果您在程序运行一段时间后遇到问题,您可能还想通过Instruments运行它。确保没有泄漏大量内存或线程。这可能会给你描述的症状。

<强> EDIT2

为什么不加载脚本并将其保存在ivar或静态中而不是按需加载?即使已编译,您仍然必须从磁盘读取它,解析它并构建数据结构。 (此外,这个问题已经脱离了它的主题。你应该关闭它并开始一个关于Applescript性能的新问题。否则它会搞砸那些正在寻找答案的人。)