iPhone上将操作分解为多个线程是否有优势?

时间:2010-10-17 14:55:03

标签: iphone objective-c multithreading optimization

我的iPhone应用程序中有一个非常重复的方法(一遍又一遍地按顺序调用)。该方法非常庞大,需要大约一秒钟才能完成。

我的问题是:如果我要多线程运行它,同时说不同线程上的5个方法调用,那会比一个接一个地运行5个调用更快吗?我知道对于具有多核处理器的台式机,这将是一个优势,但我不确定iPhone。

有什么建议吗?

3 个答案:

答案 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 GuideGCD reference manual

<强>更新

另请参阅GCD上的this article from Ars。他们解释了GCD如何决定如何安排块的一些细节。