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

如何解决目标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,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],^(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循环,而是会充分利用并行的可用内核,因此提高了性能,并有可能使执行时间减半。如果不考虑要枚举的数组和在该块内执行的任务,这不是您要做的事情,但是如果谨慎使用,它对于多种情况很有用。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?