目标C —枚举数组的最快,最有效的方法是什么?

| 编辑 我通读了一些有关块和快速枚举以及GCD等的文章。 @Bbum写了许多有关GCD和块的文章,他说块枚举方法总是比快速枚举等效方法快或快。您可以在这里阅读他的推理。 虽然这是一次有趣的,理性的对话,但我同意那些人的话,这实际上取决于当前的任务。 我有一些任务需要完成,我需要快速,廉价和高效地完成它们。 Apple为我们要枚举数组的方式提供了许多选择,但我不确定该选择哪个。 快速枚举
for (id obj in array)
{
    /* Do something with |obj|. */
}
非并行块枚举
[array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
    /* Do something with |obj|. */
}];
并发块枚举
[array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
    /* Do something with |obj|. */
}];
GCD申请
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_apply([array count], queue, ^(size_t idx) {
    id obj = [array objectAtIndex: idx];
    /* Do something with |obj|. */
});
GCD异步申请
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^(void) {
    dispatch_apply([array count], queue, ^(size_t idx) {
        id obj = [array objectAtIndex: idx];
        /* Do something with |obj|. */
    });
});
或者也许是5英镑或6英镑的东西? TIA,Alex。     
已邀请:
        最快的代码是最先进入市场的代码。 严重的是-除非您遇到可衡量的性能问题,否则,这种特殊的选择不会占用您的时间,而是要花多少时间来回答哪种模式最自然地适合我的项目风格? 注意:通过从串行执行转移到并发执行来解决性能问题通常会导致两个问题。性能和并发性。     
        这实际上取决于手头的任务。 一次处理一个以上的迭代需要生成线程。如果迭代中的逻辑是可并行化的,并且所花费的时间比生成线程所需的时间长,那么请使用线程。另外,如果数组中有太多项,则生成一个线程要比遍历整个数组花费的时间少,请将您的数组分成几部分并进行并行处理。 否则,产生线程以遍历数组是开销。即使操作系统为您解决了这一问题,它仍然需要生成它们。这需要时间和资源以及在运行时进行上下文切换(取决于可用的CPU数量,负载,调度程序等)。 最终取决于产生新线程是否比遍历整个数组花费的时间更长。您可以使用性能分析工具找到答案。     
        如果您观看WWDC视频“ iOS7中的隐藏开发宝典”(此问题早于所授予的视频),您会发现使用GCD可以更好地实现简单的for循环枚举:
[array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
    /* Do something with |obj|. */
}];
尽管它确实在一定程度上取决于手头的任务,并且运输软件是最重要的,但是绝对肯定有简便的方法,可以防止将来在应用程序开始扩展时将性能问题作为技术债务问题而出现。例如,您可能会有很大的网络获取结果。根据此结果,您可能必须迭代获取的对象并更新某些模型或模型系列(不是Core Data模型,因为Core Data不是线程安全的!必须采取其他措施才能在多个线程上使用Core Data。如果您正在考虑从多线程方案中处理核心数据,那么您将需要研究一个很深的主题)。考虑到您没有对UI进行更新(这不是您不希望在主线程上执行的操作),因此可以使用此方法来充分利用设备的硬件。它不会一次只使用一个内核的for循环,而是会充分利用并行的可用内核,因此提高了性能,并有可能使执行时间减半。如果不考虑要枚举的数组和在该块内执行的任务,这不是您要做的事情,但是如果谨慎使用,它对于多种情况很有用。     

要回复问题请先登录注册