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

发布于 2024-10-16 12:40:45 字数 102 浏览 3 评论 0原文

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

所包含对象的大多数 ivar 都是字符串,我想查询它们。

Performance wise, on a relatively large array (so far the usual count for the original array is ±20000), which method is best suited to filter it? Blocks or predicates?

Most of the ivars of the contained objects are strings and I want to query those.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心是晴朗的。 2024-10-23 12:40:45

有一种方法可以使块更快:

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

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

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

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

There is one way that blocks could be faster:

  1. You use NSEnumerationConcurrent to enumerate the array.
  2. When you find an object that matches your condition, dispatch another block to a serial queue that adds the object to the result array. (You can't do this concurrently because NSMutableArrays are not thread safe.)

However, the documentation doesn't explicitly say that order will be preserved when enumerating concurrently. I think it's a good bet that it won't be. If the order of the array matters, you'd have to re-sort (if that's even possible), and you'd have to include that in any timing comparison.

The other ways are to non-concurrently enumerate using blocks and to filter using predicates. filterUsingPredicate: could be faster, since NSArray will have the opportunity to use internal knowledge to build the result array faster than repeated addObject: messages. But that's merely a possibility; the only way to know for sure would be to compare, and even then, the answer could change at any time (including in the same process, for different input arrays or different objects in the array).

My advice would be to implement it straightforwardly—using predicates—at first, and then use Instruments to see whether it's a performance problem. If not, clear code wins. If it is a performance problem, try concurrent enumeration.

野鹿林 2024-10-23 12:40:45

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

When talking about performance it’s hard to beat an experiment. We could argue a whole day about the various performance implications of blocks or whatever solution used, but it’s best when you measure on the actual data used in your application.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文