如何更快地减少开销和 运行 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 倍。
我正在开发一个应用程序,可能需要按顺序 运行 许多 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 倍。