NSTask 中的命令行工具 运行 速度较慢,但​​终端中速度较快

Command line tool running slowly from NSTask but fast from Terminal

我写了一个 cmdline 工具,通常需要 15-20 秒才能完成。

在执行任务时,它至少每秒通过 stdout.

输出一次进度

当我运行来自Terminal.app的命令时,它会尽可能快地执行,例如不到20秒。

但是当我通过 NSTask 从我的 GUI 应用程序 运行 它时,该工具至少需要 3-5 倍的时间。

GUI 应用程序使用 NSPipeNSFileHandleReadCompletionNotification 上的观察者来监视工具的输出,并且经常到达(例如至少每秒一次)。

我尝试将 NSTaskqualityOfService 属性 设置为更高的值(最大 0x21),但没有任何改进。

任务是从线程启动的(通过 performSelectorInBackground 调用)并通过调用其 waitUntilExit 方法等待任务完成。

我检查了 Activity 监视器:

我在 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