我的iPhone应用程序中有一个非常重复的方法(一遍又一遍地按顺序调用)。该方法非常庞大,需要大约一秒钟才能完成。
我的问题是:如果我要多线程运行它,同时说不同线程上的5个方法调用,那会比一个接一个地运行5个调用更快吗?我知道对于具有多核处理器的台式机,这将是一个优势,但我不确定iPhone。
有什么建议吗?
答案 0 :(得分:2)
尝试一下,没有更好的答案。这并不难:
- (void) startInParallel {
for (int i=0; i<5; i++)
[self performSelectorInBackground:@selector(doSomeWork)];
}
另外,您可能想要添加一些时间测量。然后,如果您发现并行运行所有操作确实有意义,您可以使用NSOperations或GCD来执行此操作。 (我只是希望performSelectorInBackground没有足够的时间来扭曲测试结果。)
答案 1 :(得分:2)
如果它类似于网络请求,它很可能会更快,因为你花时间等待而没有真正使用处理器(尽管产生线程并不是真正处理它的最佳方法)。但是如果这个方法做了一些繁重的计算,你将无法获得任何收益。尽管如此,为了保持UI响应,您将在后台运行冗长的任务。使用NSOperation
来做这些事情通常会更好更简单,所以看看那个类。
答案 2 :(得分:2)
使用Grand Central Dispatch(又名GCD和libdispatch),它只会做正确的事(tm)。
如果在其中一个全局队列上调用dispatch_async,GCD将根据系统工作负载计算是否生成新线程来处理您提交的操作,或者是否在一个线程上串行运行它们。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do your calculations here
// If you want to run code on the main loop with the result of the calculations,
// do something like this
dispatch_async(dispatch_get_main_queue(), ^{
// Code to run on the main thread here
});
});
您还可以使用调度组在完成所有五个调用后运行一些代码。
有关详细信息,请查看Concurrency Programming Guide和GCD reference manual。
<强>更新强>
另请参阅GCD上的this article from Ars。他们解释了GCD如何决定如何安排块的一些细节。