何时使用 NSEnumerationConcurrent

2024-01-28

我时不时地注意到,我使用块来迭代集合,而不会写入任何共享数据或导致任何副作用。我考虑添加 NSEnumerationConcurrent 选项,然后决定不使用它,因为我不太明白何时值得使用它。

所以我有一个具体的问题和一个更一般的问题。

第一个问题:这是一个可能稍微做作的例子,使用块同时做一些琐碎的事情:

CGFloat GetAverageHeight(NSArray* people)
{
  NSUInteger count = [people count];
  CGFloat* heights = malloc(sizeof(CGFloat) * count);

  [people enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock:
  ^(id person, NSUInteger idx, BOOL* stop)
  {
    heights[idx] = [person height];
  }];

  CGFloat total= 0.0;
  for (size_t i = 0 ; i < count ; i++) total += heights[i];
  free(heights);
  return total / count;
}

忽略非并发枚举可以直接对高度求和,而不需要调用 malloc 或函数后半部分的事实,这里使用 NSEnumerationConcurrent 有什么意义吗?使用 GCD(或 NSEnumerationConcurrent 在后台执行的任何操作)的开销是否会抵消同时获取琐碎属性的收益?在值得使用 NSEnumerationConcurrent 之前,块的工作需要变得不那么琐碎吗?

第二个问题:更一般地说,当我看到有机会这样做时,我是否应该考虑使用并发性(理由:大概这些 API 的目的是它们使并发性不再是一种特殊情况,而更多地成为一般构成的一部分)程序的一部分),或者只是一种优化,只有在我发现特定的性能问题并相信并发是答案时才应该使用(理由:并发代码中的错误是追踪的噩梦)?


一般来说,只有当要执行的操作相对“繁重”时,您才会使用并发。即使如此,使用提供的原始并发性enumerateObjectsWithOptions:如果并行性对于手头的任务来说是错误的粒度,那么很容易出现问题。

GCD 在排队和处理内容方面确实非常高效,但该代码很可能最终会调用 malloc() 来复制块(取决于该块是否具有唯一的捕获状态)。

你的第二个问题的答案写满了很多书,但大多毫无用处。

获取非并发代码并使其并发通常是一个非常困难的问题,充满了噩梦般的错误。然而,预先设计并发性可能会非常耗时。更糟糕的是,在没有实际使用它的情况下实现未来的并发性只会在您打开它时导致噩梦般的调试体验。

一个关键点;在考虑并发性时,重点关注使对象的整个子图线程隔离,以保存跨线程/队列的定义非常明确的边界 API。核心数据就是一个很好的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 NSEnumerationConcurrent 的相关文章

  • iOS 6 仅支持一个视图的不同方向

    我只想将应用程序中的一个视图旋转到左横向或右横向 我的所有其他视图均处于纵向模式 并且我已将我的应用程序设置为仅支持纵向模式 随着 iOS 6 中方向的改变 我不知道如何做到这一点 我已经尝试过下面发布的内容 谁能告诉我我做错了什么 谢谢
  • iOS:管理本地化图像

    我有 2 组 iPhone 应用程序的本地化图像 我应该如何放置图像 我如何加载到应用程序中 文件夹结构如下 For English version MyApp en lproj Localizable strings InfoPList
  • Objective-C 中的前向声明枚举

    我在 Objective C 程序中的枚举可见性方面遇到问题 我有两个头文件 其中一个定义了typedef enum 另一个文件需要使用typedef d type 在直C中 我会简单地 include另一个头文件 但在 Objective
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • 以编程方式更改 mac osx 上的代理

    如何以编程方式更改 mac osx 上的代理设置 我对ios很流利 而且由于mac os编程类似 所以应该不会有太多问题 然而 我缺乏以编程方式创建代理更改所需的逻辑 手动调整非常容易 这是我所追求的系统偏好设置中的网络选项卡 我尝试过的
  • 如何在可可中获取图像的作者

    我不明白为什么metaDic 总是为空 有一个代码 CFDataRef dataRef CGDataProviderCopyData CGImageGetDataProvider img CGImage UIImage img CGImag
  • 如何在 Python 中使用线程?

    我想要一个清晰的示例 显示任务被划分到多个线程中 自从 2010 年提出这个问题以来 如何使用 Python 进行简单的多线程处理已经有了真正的简化map https docs python org 2 library functions
  • iOS:两个 UIAlert 具有两种不同的委托方法

    我有一个 UIAlert UIAlertView alertView UIAlertView alloc initWithTitle ok message Canc delegate self cancelButtonTitle OK ot
  • 如何使用 python 的 asyncio 模块正确创建和运行并发任务?

    我正在尝试正确理解并实现两个同时运行的Task https docs python org 3 library asyncio task html task使用Python 3相对较新的对象asyncio https docs python
  • 多对多关系中的 KVO 对象属性

    我有一个核心数据对多关系 由父 gt 子组成 我想设置一个键值观察机制 以便当任何子对象上的属性 例如 firstName lastName 发生更改时 它会触发通知 使用标准 KVO 语法时 self parentObject addOb
  • NSPredicateEditor 行模板不可在界面生成器中配置

    我正在界面生成器的故事板中创建一个辅助表 viewController 包含一个NSPredicateEditor并使用 cocoa 绑定连接到 viewController 的属性 但是 我无法正确配置行模板 当我取消选中其中一个谓词运算
  • UIWebView didFinishLoading 多次触发

    我有一些代码需要在 a 之后运行UIWebView完成加载文档 为此我设置了UIWebView的委托给我的控制器 并实现了webViewDidFinishLoading method 这会被多次调用 具体取决于要加载的页面类型 我不确定是否
  • 如何在 Objective-C 中将 RGB 十六进制字符串转换为 UIColor?

    我有来自 url 数据的颜色值 如下所示 ff33cc 如何将此值转换为 UIColor 我正在尝试使用以下代码行 我没有正确获取 baseColor1 的值 看来我应该把那磅炭拿掉 还有其他方法吗 NSScanner scanner2 N
  • object_setClass()而不是分配isa指针的性能

    我注意到在 XCode 4 6 的最新更新中 我收到了关于以下几行的警告JSONKit m 具体来说 设置对象类的行 dictionary gt isa JKDictionaryClass 这些被标记为已弃用 并注明首选方法是使用objec
  • 由于无法确认开发者身份而无法打开

    我在 Mac OSX 中开发了一个应用程序和守护进程 并且我已经在 xcode 中与开发者 ID 签署了应用程序和守护进程源代码 在守护进程中 我已经对每个框架进行了签名并打包 并且我使用软件包安装程序对所有框架进行了 pkg 现在我的应用
  • 如何阻止我的应用程序设置“隔离”位?

    从 OS X 10 7 3 开始 我的文本编辑器就在它接触的任何文件上设置 隔离 位 我的文本编辑器设计用于处理 shell 脚本 如果设置了隔离位 则无法从命令行执行 shell 脚本 直到您在 Finder 中双击它并浏览 此应用程序是
  • 使 Swift 类符合需要 init 的协议

    我有以下内容protocol in Swift protocol FooConvertible typealias FooType init foo FooType 我会做Swift类在类定义中符合它 class Bar FooConver
  • 创建宏来执行默认初始化

    我有很多重复这个简单样板的方法 id myObject if myObject self myObject myObject class new return myObject 所以我想用一个简单的宏来替换它 define default
  • 从 xib 中提取 UI 项目?

    经过一番浏览文档后 我决定使用以下技术 使用 viewWithTag 从 loadNibNamed owner options 返回的主根视图中提取子视图 首先 我有点困惑 因为我假设 loadNibNamed owner options
  • StoryBoard 2 导航控制器指向相同的视图

    有谁知道为什么这不起作用 这样 只有一个选项卡栏加载视图 另一个选项卡栏则显示黑屏 我在没有导航控制器的情况下尝试过 选项卡栏是正确的 而另一个在运行模式下不显示选项卡栏项目 如果有人感兴趣的话我对这个问题的回答 添加两个视图来启动我们感兴

随机推荐

  • Boost Python 的性能

    我正在做一个项目 正在尝试使用 boost python 当研究如何组织我的 python 界面时 我遇到了一个问题comment https stackoverflow com questions 4774807 how to organ
  • 立即应用用户界面更改

    我正在 Android 上编写一些 ui 屏幕 有时我需要立即查看 ui 更改 但可以在下一个 ui 线程请求中看到该更改 因此 例如 如果我删除屏幕上的一个视图并以编程方式添加另一个视图 然后更改整个视图 使用 viewAnimator
  • 节点的 xlabels 与点中的边缘重叠

    我尝试使用 dot 绘制图表 但遇到以下问题 节点的标签b与边缘重叠a to b 有没有办法以某种方式移动这个标签来避免这种情况 这是我用来生成图像的代码 使用dot digraph A rankdir LR center true mar
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 用 C++ 读取配置 xml 文件

    如何在C 中读取以下配置文件 STL有支持吗 我无法使用其他第三方库
  • 动画 UIButton Down - Xcode

    我想知道当点击时如何使 UIButton 向下动画 IBAction 提前致谢 在你的里面IBAction UIButton button UIButton sender animates button 25 pixels right an
  • 将寄存器加载到自身的指令的目的是什么?

    在查看 Gameboy 的指令集时 我遇到了如下指令 LD A A LD B B LD C C LD D D 每条指令都有自己的操作码这张桌子 http www pastraiser com cpu gameboy gameboy opco
  • Apollo 客户端错误:无法在上下文中找到“客户端”或作为选项传入。将根组件包装在

    我是新来的阿波罗 我目前正在尝试使用 React 和 Apollo 创建一个应用程序 当我启动我的应用程序时 出现以下错误 在上下文中找不到 客户端 或作为选项传入 将根组件包装在 中 或通过选项传递 ApolloClient 实例 Her
  • 64 位 Windows 的 cygwin 1.7.26 中的 rxvt-native 实用程序在哪里?

    我一直在 cygwin 上使用 rxvt native 程序 我安装了 64 位 cygwin 但在其中找不到 rxvt 包 我安装了相同版本的32位cygwin 看起来它仍然存在 有人知道为什么这个软件包不能用于 64 位 cygwin
  • 如果延迟超过 2147483648 毫秒,setTimeout 会立即触发

    问题 If the delay超过 2147483648 毫秒 24 8551 天 该函数将立即触发 Example setTimeout function console log hey 2147483648 this fires ear
  • Jquery,将标题转换为 Slug

    我有一个执行以下操作的 PHP 脚本 它接受一个字符串 例如 This is a Great Blog Post 1 并返回以下字符串 this is a great blog post 1 我不完全是 Jquery 专家 这就是我问这个问
  • Python-MySQL 中的错误处理

    我正在运行一个基于 python Flask 的小型 Web 服务 我想在其中执行一个小型 MySQL 查询 当我获得 SQL 查询的有效输入时 一切都按预期工作 并且我得到了正确的值 但是 如果该值未存储在数据库中 我会收到一个TypeE
  • 如何使用模板根据类型将元素添加到各种容器

    我有一个相当愚蠢的问题 但我希望你能帮助我 我有包含多个向量的类 并且这些向量具有不同的存储类型 class BaseClass std string Name class B public BaseClass class C public
  • 两栏布局,固定右栏

    我被一个看似简单的两列 CSS 布局所困扰 通常 这种布局很简单 但我正在构建一个响应式网站 需要各列以移动设备的正确顺序折叠 彼此重叠 在桌面上 我需要右列的大小固定 例如 200px 其余区域由左列占据 当然 我需要这些列来清除并将内容
  • Python 中用于日志记录替代功能的配置文件

    我有功能 def go logger logfilename formatter logging Formatter asctime s levelname s message s logging basicConfig filemode
  • 模拟麦克风输入

    我正在尝试编写一个小程序来读取 wav 文件并发送输出 就好像它来自我的麦克风一样 不幸的是我对声音 API 没有太多经验 背景 我基本上想要实现的是一个在我进行语音聊天时播放声音的程序 即 Teamspeak Ventrilo 为了让它现
  • Java 获取特定日期前一天

    我有一个字符串过期日期 但我需要在过期日期到来的前一天执行一些 SQL 语句 我得到了我的过期日期和截止日期 SimpleDateFormat dateFormat new SimpleDateFormat dd MM yyyy Strin
  • 如何使用 mongodump 转储匹配特定日期范围的记录?

    我正在尝试使用 mongodump 命令转储在特定日期创建的一堆记录 这些记录包含一个 ts 字段 它是 MongoDB Date 对象 mongodump 采用 q 参数 可用于运行查询来选择要包含在转储中的记录 不幸的是 q 参数需要在
  • Rails 3.2.8 引擎中 simple_form 的加载错误

    当在 Rails 3 2 8 引擎中加载 simple form 时 simple form 初始值设定项文件 simple form rb 会导致错误 config initializers simple form rb 2 in
  • 何时使用 NSEnumerationConcurrent

    我时不时地注意到 我使用块来迭代集合 而不会写入任何共享数据或导致任何副作用 我考虑添加 NSEnumerationConcurrent 选项 然后决定不使用它 因为我不太明白何时值得使用它 所以我有一个具体的问题和一个更一般的问题 第一个