5

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

包含的对象的大多数 ivars 都是字符串,我想查询这些。

4

2 回答 2

5

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

  1. NSEnumerationConcurrent用来枚举数组。
  2. 当您找到与您的条件匹配的对象时,将另一个块分派到一个串行队列,该队列将该对象添加到结果数组中。(您不能同时执行此操作,因为 NSMutableArrays 不是线程安全的。)

但是,文档没有明确说明在同时枚举时将保留顺序。我认为它不会是一个很好的选择。如果数组的顺序很重要,则必须重新排序(如果可能的话),并且必须将其包含在任何时序比较中。

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

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

于 2011-02-07T14:31:05.173 回答
3

在谈论性能时,很难击败实验。我们可能会就块的各种性能影响或使用的任何解决方案争论一整天,但最好是根据应用程序中使用的实际数据进行测量。

于 2011-02-07T14:30:22.480 回答