这个问题可能与每个开发人员都希望他们的系统做的事情相反。
我正在创建一个软件,该软件可以查看特定文件的目录并将其读入并执行某些操作。这可能会产生高CPU负载。我使用GCD
来创建放入NSOperationQueue
的线程。我想知道的是,是否有可能使这个操作不占用这么大的CPU负载?我希望运行速度慢,因为速度不是问题,但应用程序应该在后台运行非常好非常重要。
简而言之。我可以让NSOperationQueue
或线程一般慢慢运行而不使用睡眠之类的东西吗?
应用程序遍历目录结构,查找所有图像并创建缩略图。只需遍历目录就可以使CPU负载很高。
答案 0 :(得分:0)
流程优先级:nice / renice。
请参阅: https://superuser.com/questions/42817/is-there-any-way-to-set-the-priority-of-a-process-in-mac-os-x#42819 但你也可以通过编程方式完成。
您的线程是CPU密集型的。这导致两个问题:
他们是否需要如此CPU密集型?他们在做什么,这是CPU密集型的?描述代码。当你使用线性算法时,你是否正在使用(比方说)二次算法?
与包装盒上的其他进程很好地配合使用。如果盒子上没有其他东西那么你/想要/使用所有可用的CPU资源:否则你只是在浪费时间。但是,还有其他东西在运行然后你想要推迟(在合理范围内),这意味着给你的进程一个比其他进程更低的优先级(即/更高/更好的值)。默认情况下,进程的值为0,所以只需将其设置得更大(比如说+10)。你必须是root才能让流程变得消极。
答案 1 :(得分:0)
并发编程指南中的Operation Queues部分介绍了更改NSOperation
优先级的过程:
更改基础线程优先级
在OS X v10.6及更高版本中,可以配置操作的基础线程的执行优先级。系统中的线程策略本身由内核管理,但通常优先级较高的线程比较低优先级的线程有更多的运行机会。在操作对象中,将线程优先级指定为0.0到1.0范围内的浮点值,其中0.0是最低优先级,1.0是最高优先级。如果未指定显式线程优先级,则操作将以默认线程优先级0.5运行。
要设置操作的线程优先级,必须先调用操作对象的
setThreadPriority:
方法,然后再将其添加到队列中(或手动执行)。当执行操作时,默认的start方法使用您指定的值来修改当前线程的优先级。此新优先级仅在操作主要方法的持续时间内有效。所有其他代码(包括操作的完成块)都使用默认线程优先级运行。如果创建并发操作,并因此覆盖start方法,则必须自己配置线程优先级。
话虽如此,我不确定通过调整线程优先级你会看到多少性能差异。对于更戏剧性的性能更改,您可能必须使用计时器,睡眠/暂停线程等。
如果您正在扫描文件系统以查找已更改的文件,您可能需要参考File System Events Programming Guide以获取有关响应文件系统更改的轻量级技术的指导。