如何更快地减少开销和 运行 applescripts?

How to reduce overhead and run applescripts faster?

我正在开发一个应用程序,可能需要按顺序 运行 许多 applescripts,我正在寻找任何方法来更快地 运行 applescripts。我不是在谈论内部结构,我只是在谈论执行 startup/cleanup.

示例:

onePlusOne.applescript:

1+1

然后我用 osacompile -o onePlusOne.scpt onePlusOne.applescript

编译了这个

现在,测试(在 bash shell):

time zsh -c "(( val = 1 + 1 ))":

real    0m0.013s
user    0m0.004s
sys 0m0.007s

time osascript onePlusOne.scpt:

real    0m0.054s
user    0m0.026s
sys 0m0.022s

我想知道是否可以对额外的开销做任何事情并更快地执行 applescripts。

你没有说什么类型的应用程序,什么类型的 AppleScripts,或者脚本是应用程序的一部分还是用户提供的。你也不会说你是否真的构建了一个原型并发现了实际的性能问题,或者现在正在谈论 purely hypotheticals

假设一个典型的沙盒 Swift/ObjC 桌面应用程序:

  • 对于任意用户提供的 AppleScript,您通常希望在应用程序自己的沙箱之外使用 NSUserAppleScriptTask 作为 运行s 脚本。一个很大的限制:它的子进程不是持久的,所以你不能一次加载脚本并多次调用它的处理程序;你必须每次都创建一个新的子进程,如果你想在调用之间保留脚本的状态,那么你必须自己安排一些事情。

  • 上述情况的例外情况:如果您的用户提供的脚本可以 运行 在应用沙箱的限制内,则 运行 通过 NSAppleScript/OSAScript 是一个选项,它们允许您一次加载脚本并多次调用它。

  • 对于内置 AppleScript,使用 AppleScript-ObjC 桥将您的脚本公开为 ObjC 子类,并且 call their handlers directly。那里的开销主要在过桥的时间上。

否则,开销就是开销;通常您无能为力。 TBH,您的平均 AppleScript 将花费更多时间等待 IO(Apple 事件 IPC 功能强大但速度慢)或通过病态算法进行搅动(例如,由于 AS 的内部结构不佳,迭代列表通常 O(n²),而且大多数 AppleScripters 都是业余爱好者,所以会写出低效的代码)。可能有一些方法可以改善较差的 运行 时间性能,但这是一个更大的讨论。

最后一个考虑因素:使用基于 AppleScript 的自动化,“速度快吗?”不如“它比手工完成同样的任务快吗”重要?即使是速度较慢的 AppleScript 也比速度快的人快 10-100 倍。