哪一个更快? for-loop或isEqualToArray

时间:2013-08-26 11:33:56

标签: ios objective-c function

我想知道isEqualToArray实际上做了什么......

我有一个大小为160的数组,每个数组包含一个包含11个条目的字典,但我可以简单地根据第一列进行比较(包含更改行的日期)。

现在我可以用一个简单的for-cycle来做到这一点:

        BOOL different = FALSE;
        for (int index = 0 ; index < [newInfo count] ; ++index)
            if (![[[oldInfo objectAtIndex:index] objectForKey:@"Update"] isEqual:[[newInfo objectAtIndex:index] objectForKey:@"Update"]]) {

                different = TRUE;
                break;
            }
        if (different) {
        }
        else
            NSLog(@"Contact information hasn't been updated yet");

或者我可以使用内置的isEqualToArray方法:

        if ([oldInfo isEqualToArray:newInfo])
            NSLog(@"Contact information hasn't been updated yet");
        else {
            NSLog(@"Contact information has been updated, saving new contact information");
            [newInfo writeToFile:path atomically:YES];
        }

现在,如果假设isEqualToArray只为每个单元调用isEqualTo,那么for循环方法运行的时间是isEqualToArray的1/11(只需要比较一列而不是11)。

也许我只是在进行优化......(我曾经参加过许多比赛,其中运行时间有限且我感觉有后遗症)。

3 个答案:

答案 0 :(得分:4)

The Documentation说:

  

如果每个数组拥有相同数量的对象,并且每个数组中给定索引处的对象满足isEqual:测试,则两个数组具有相同的内容。

所以基本上你是对的。

从设计的角度来看,我会选择isEqualToArray:,因为如果您关注性能,它会使代码更容易理解或引入BOOL hasUpdates,这样您还有额外的优势不必在内存中保留两份副本。

答案 1 :(得分:2)

我怀疑很多人错误地认为性能与执行的源语句的数量成正比,并且与等效的直接编码循环相比,像isEqualToArray这样的函数的速度非常快。

事实上,虽然有时候这些API的编码器确实知道一些“交易技巧”,这些技巧可以加快速度(或者可以访问你不能使用的内部接口),但他们必须经常抛出在另外的逻辑中处理你不关心的“古怪”案例,或者仅仅是为了使API“一般”。

因此,在大多数情况下,选择应基于哪个最合理地适合整个程序并使逻辑清晰。在某些情况下,显式循环更好,特别是如果可以利用某些逻辑(例如,采用稍后需要的数组值的“最大值”)以避免重复工作。

此外,当存在复杂的API函数(比isEqualToArray更复杂)时,您不太清楚自己是否理解,通常以直接的方式编写代码而不是处理复杂的函数会更好。一旦你的代码工作,你可以回来并“优化”使用复杂的API。

答案 2 :(得分:-1)

当你知道两个对象都是数组时,isEqualTo<Class>方法是检查相等性而不是循环的更快方法。

isEqualTo<Class>用于为equality.so isEqualToArray:提供特定的检查,检查数组是否包含相同数量的对象。

据我所知,当你知道两个对象是数组时,我可以说isEqualToArray是更好的选择。