NSTask 中的命令行工具 运行 速度较慢,但终端中速度较快
Command line tool running slowly from NSTask but fast from Terminal
我写了一个 cmdline 工具,通常需要 15-20 秒才能完成。
在执行任务时,它至少每秒通过 stdout
.
输出一次进度
当我运行来自Terminal.app的命令时,它会尽可能快地执行,例如不到20秒。
但是当我通过 NSTask
从我的 GUI 应用程序 运行 它时,该工具至少需要 3-5 倍的时间。
GUI 应用程序使用 NSPipe
和 NSFileHandleReadCompletionNotification
上的观察者来监视工具的输出,并且经常到达(例如至少每秒一次)。
我尝试将 NSTask
的 qualityOfService
属性 设置为更高的值(最大 0x21),但没有任何改进。
任务是从线程启动的(通过 performSelectorInBackground
调用)并通过调用其 waitUntilExit
方法等待任务完成。
我检查了 Activity 监视器:
- GUI 应用程序和工具均未进入 App Nap 模式。
- 我可以看到,当从终端 运行ning 时,该工具使用 CPU 的恒定 30%,而当从 GUI 应用程序 运行 时,该工具通常会下降到 10% 以下。
我在 10.13.6 上的两台配置非常不同的计算机上看到了这个问题。我还没有机会在其他 OS 版本上进行测试,但如果它在 10.13 中运行不佳,那已经够糟糕了。
什么可能导致工具像这样受到限制?
该工具大部分时间都在内核中,因为它会调用 searchfs()
,它会广泛扫描文件系统。我想知道这是否是问题的一部分。
此外,有人可以建议 运行 以一种让 GUI 应用程序控制其生命周期的方式使用该工具的替代方案(即它应该 运行 作为子进程),让它向工具传递参数并读取其 stderr 和 stdout 管道?
您始终可以通过启动 NSTask 来提高它的优先级:
nice -n *priority* *command* *arguments*
其中优先级必须是-20以内的负数,负数越多优先级越高
但是您需要超级用户权限才能启动这样的命令。
您可以在这里阅读:
https://ss64.com/osx/nice.html
或此处:
https://superuser.com/questions/42817/is-there-any-way-to-set-the-priority-of-a-process-in-mac-os-x
我写了一个 cmdline 工具,通常需要 15-20 秒才能完成。
在执行任务时,它至少每秒通过 stdout
.
当我运行来自Terminal.app的命令时,它会尽可能快地执行,例如不到20秒。
但是当我通过 NSTask
从我的 GUI 应用程序 运行 它时,该工具至少需要 3-5 倍的时间。
GUI 应用程序使用 NSPipe
和 NSFileHandleReadCompletionNotification
上的观察者来监视工具的输出,并且经常到达(例如至少每秒一次)。
我尝试将 NSTask
的 qualityOfService
属性 设置为更高的值(最大 0x21),但没有任何改进。
任务是从线程启动的(通过 performSelectorInBackground
调用)并通过调用其 waitUntilExit
方法等待任务完成。
我检查了 Activity 监视器:
- GUI 应用程序和工具均未进入 App Nap 模式。
- 我可以看到,当从终端 运行ning 时,该工具使用 CPU 的恒定 30%,而当从 GUI 应用程序 运行 时,该工具通常会下降到 10% 以下。
我在 10.13.6 上的两台配置非常不同的计算机上看到了这个问题。我还没有机会在其他 OS 版本上进行测试,但如果它在 10.13 中运行不佳,那已经够糟糕了。
什么可能导致工具像这样受到限制?
该工具大部分时间都在内核中,因为它会调用 searchfs()
,它会广泛扫描文件系统。我想知道这是否是问题的一部分。
此外,有人可以建议 运行 以一种让 GUI 应用程序控制其生命周期的方式使用该工具的替代方案(即它应该 运行 作为子进程),让它向工具传递参数并读取其 stderr 和 stdout 管道?
您始终可以通过启动 NSTask 来提高它的优先级:
nice -n *priority* *command* *arguments*
其中优先级必须是-20以内的负数,负数越多优先级越高
但是您需要超级用户权限才能启动这样的命令。
您可以在这里阅读:
https://ss64.com/osx/nice.html
或此处:
https://superuser.com/questions/42817/is-there-any-way-to-set-the-priority-of-a-process-in-mac-os-x