Objective C — 枚举数组的最快、最有效的方法是什么?

13 浏览
0 Comments

Objective C — 枚举数组的最快、最有效的方法是什么?

编辑

我阅读了一些关于块和快速枚举和GCD等方面的文章。 @Bbum,曾经写过很多关于GCD和块的文章,他说块枚举方法始终比快速枚举等效方法更快。你可以在这里阅读他的理由。

虽然这是一场引人入胜的知识交流,但我同意那些认为它实际上取决于手头的任务的人。


我有一些任务需要完成,并且需要快速、便宜和高效地完成它们。苹果给了我们很多选项来枚举数组,但我不确定应该选择哪个。

快速枚举

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, NSUInteger idx, 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], queue, ^(size_t idx) {
        id obj = [array objectAtIndex: idx];
        /* Do something with |obj|. */
    });
});

或者也许可以使用NSBlockOperation或者NSOperationQueue

谢谢,Alex。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这真的取决于手头的任务。

处理多个迭代需要生成线程。如果迭代中的逻辑是可并行的,并且所需时间比生成线程要长,那么使用线程。此外,如果数组中有许多项,生成线程所需的时间少于遍历整个数组,则将数组分成几个部分并并行处理它们。

否则,生成线程来迭代数组是开销的。即使操作系统为您处理了这个问题,它仍然需要生成线程。这需要时间和资源,并且可能会在运行时进行上下文切换(取决于可用的CPU数量、负载、调度器等)。

所有这一切都归结为生成新线程需要的时间是否比遍历整个数组长。您可以使用 profiling 工具来了解这一点。

0
0 Comments

最快的代码是最先到达市场的代码。

说真的,除非你有可衡量的性能问题,否则这个选择应该不会花费你太多时间,就像回答这些模式中哪一个最符合我的项目风格一样。

注意:通过从串行执行迁移到并发执行来解决性能问题通常会导致两个问题:性能和并发。

0