NSArray过滤:在哪种情况下使用谓词和使用块的情况?

时间:2011-02-07 13:21:13

标签: objective-c arrays cocoa objective-c-blocks predicates

性能方面,在一个相对较大的阵列上(到目前为止,原始阵列的通常计数是±20000),哪种方法最适合过滤它?阻止或谓词?

包含对象的大部分ivars都是字符串,我想查询它们。

2 个答案:

答案 0 :(得分:5)

有一种方法可以让阻止更快:

  1. 您使用NSEnumerationConcurrent枚举数组。
  2. 当您找到符合条件的对象时,将另一个块分派给将对象添加到结果数组的串行队列。 (你不能同时执行此操作,因为NSMutableArrays不是线程安全的。)
  3. 但是,文档没有明确说明并发枚举时将保留顺序。我认为这不是一个好赌注。如果数组的顺序很重要,你必须重新排序(如果可能的话),你必须在任何时序比较中包含它。

    其他方法是使用块非并发枚举并使用谓词进行过滤。 filterUsingPredicate:可能更快,因为NSArray将有机会使用内部知识来构建结果数组,而不是重复的addObject:消息。但那只是一种可能性;确切知道的唯一方法是进行比较,即使这样,答案也可能随时发生变化(包括在同一过程中,对于不同的输入数组或数组中的不同对象)。

    我的建议是首先使用谓词直接实现它,然后使用Instruments查看它是否是性能问题。如果没有,清除代码获胜。如果是性能问题,请尝试并发枚举。

答案 1 :(得分:3)

在谈论表演时,很难击败实验。我们可以争论一整天关于块或使用的任何解决方案的各种性能影响,但是当您测量应用程序中使用的实际数据时,它是最好的。