用于系统事件的Apple脚本(UI读取)非常慢

时间:2019-06-12 15:35:41

标签: performance applescript

我已经编写了Apple脚本来检查特定应用程序(Avid Pro Tools)的UI元素(表)。该表由给定的行数组成。每行都有一个用于选择(布尔)和索引(整数)的属性。该脚本将返回具有“已选择”属性为true的每行索引号的列表。该脚本正在运行,但是,它的运行速度非常慢。返回值将花费几秒钟。有什么办法可以加快速度吗?

告诉应用程序“系统事件”

return value of attribute "AXIndex" of (rows whose value of attribute "AXSelected" is true) of table "Track List" of (windows whose name contains "Mix: ") of application process "Pro Tools" of application "System Events"

结束告诉

1 个答案:

答案 0 :(得分:0)

这不是真正的答案,而是更多的评论,但是在类似情况下,我会考虑以下内容:

  • 稍后在脚本中使用AXIndex值是做什么的,即您是否需要行的索引号,还是可以仅存储对row对象的引用?检索索引值列表建议您在某个时候迭代这些值,因此我想知道是否通过访问您可能不需要的attribute来减慢脚本速度,然后遍历列表合并到过滤器中。

  • 如果有一个名为{{1}的attribute,则很有可能是一个名为"AXSelected"的{​​{1}},它通常包含相同的值并且会更快检索:

    property
  • 脚本实际上是不是很慢?还是只需要执行一组苛刻的复杂操作?有两个selected过滤器,其中一个正在执行... of (rows whose selected = true) of ... 比较(您可以认为这是要求它遍历字符串中的字符以找到匹配的子集,而相等性测试则是要求一眼就知道什么时候不匹配)。看看您过滤whose列表时会发生什么?如果过滤器的目的是隔离具有contains元素的窗口,则可能不需要:如果不走运,删除过滤器将对第一个windows产生错误,其中系统事件找不到特定的table "Track List"(因此也找不到您要检索的属性);但是很多时候,它只会在最终结果中插入一些window项,而这只是为了快速提高速度而进行的小的权衡。

  • 最后,您的复合筛选器的实际构造在语法上有缺陷,令我惊讶的是它实际上运行并返回了有意义的结果。内容如下:

    table

    实际上没有任何意义,因为在定义过滤器的那一刻没有迹象表明missing value是什么以及它们属于什么其他元素。显然,您已声明它们属于(rows whose value of attribute "AXSelected" is true) of table "Track List" 对象,但是该语句实际上引用了可能在任何地方都存在的rows类的某些对象,而选定的对象属于table。作为类比,这有点像不定式,英语已经以某种方式适应了将它们接受为有意义的语法形式,因为我们假设基本含义并不困难,但它们在逻辑上是腐败的并使用其他一些语言会导致一个人无法理解所讲的内容,或具有错误的意思。

    所以我想知道AppleScript是否可以这样做,如果这样做,AppleScript是否做出了错误的假设并返回了不正确的结果;还是AppleScript做出了正确的假设,但是为了解开语法而放慢了速度?

    这是表达式的正确形式,其中包括删除row的多余的双重引用:

    table "Track List"

    希望,我将子句分成多行的方式有助于更清楚地说明为什么这以原始的方式没有语法意义。也是在我注意到application "System Events"过滤子句出现相同的不明确引用时。


结论

我不能保证其中任何建议都会缩短执行时间。通过考虑所有“假设条件是什么?” 并每次对自己问一些看似毫无意义的问题,这更多是一个逐步帮助我改善脚本的思想过程。

可以随意提供更多的上下文信息,并深入了解其余脚本的整体性能,也许它将揭示出一种不同的方式来最终获得相同的结果,但所需的时间更少。