我有一个我需要几乎永久运行的过程。我正在使用performSelectorInBackground来实现这一点。使用这段代码,我的应用程序正在遭受极大的性能损失,在故障音频中表现出来。在下面的代码中使用分析器,它占用了所有时间的50%。
我想知道这是否是用于永久运行后台进程的最佳线程机制?
其他线程类型如gcd async dispatch运行速度比我的例子快,还是所有线程类型都以相同的速度执行且资源量相同?
有没有办法减少分配给线程进程的资源量?
[self performSelectorInBackground:@selector(myProgressTask) withObject:nil];
- (void)myProgressTask {
while (doprocess==YES)
{
//execute stuff
}
}
答案 0 :(得分:1)
这是一篇非常好的文章,它比较了生成线程和执行某些操作所需的资源/时间:http://cocoawithlove.com/2010/09/overhead-of-spawning-threads.html
但是,正如您所说线程对主线程有性能影响,您可以做两件事:降低线程的优先级,让操作系统知道线程需要更少的CPU周期,或者返回不需要的线程CPU时间回到系统。另一种方法是使用NSRunLoop / CFRunLoop机制来执行操作,但是,这仅适用于其小但重复的操作(从您的代码片段看起来如此)。在运行循环中执行繁重的代码可能不是最好的想法,但它在某种程度上是非阻塞的(直到用代码阻止runloop)并且你没有产生新线程的开销。
答案 1 :(得分:0)
您应该在线程中使用NSRunLoop。 Add timer并在适当的回调中执行内容。您可以通过使计时器无效来停止该循环。您还可以使用线程优先级并选择最符合您需求的线程。 Aldo检查NSThread和NSOperation的文档。
答案 2 :(得分:0)
在向您提供技术答案之前,我建议您重新审视应用程序的整体设计。一直运行一个线程通常是错误的。至少,您应该尝试定期执行函数/回调。
话虽如此,您可以使用低级pthreads库来减少分配给线程的资源量。我所知道的高级机制都没有提供配置细节。使用pthreads(以及您使用的任何其他机制),重要的是不时放弃CPU,以便其他线程可以实际访问它。这就是您遇到性能问题的原因。可能你的应用程序中的其他线程只是挨饿。为了避免这种情况,即使不使用pthread,您也可以在代码中适当地调用usleep()
和sched_yeld()
来定期放弃CPU。其他线程现在有机会执行。
如果您决定切换到pthreads,那么在使用pthread_create()
生成线程之前,您可能需要设置其属性以限制使用pthread_attr_setschedparam(
)分配给它的资源,{{1 }和pthread_attr_setschedpolicy()
。