哪一个更快?for循环或isEqualToArray



我想知道isEqualToArray实际做什么。。。

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

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

        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列)。

也许我太喜欢优化了。。。(我参加过很多比赛,运行时间有限,我感觉到了后遗症)。

文档说明:

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

所以基本上你是对的。

从设计的角度来看,我要么选择isEqualToArray:,因为它使代码更容易理解,要么如果你关心性能,就引入BOOL hasUpdates,这还有一个额外的优势,那就是你不必在内存中保存两个副本。

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

事实上,虽然有时这些API的程序员确实知道一些"交易技巧",可以加快速度(或者可以访问您无法使用的内部接口),但他们通常必须添加额外的逻辑来处理您不关心的"古怪"情况,或者只是让API变得"通用"。

因此,在大多数情况下,选择应该基于哪一个最合理地符合整个程序,并使逻辑清晰。在某些情况下,显式循环更好,尤其是如果可以利用一些逻辑(例如,获取稍后所需的数组值的"最大值")来避免重复工作。

此外,当有一个复杂的API函数(比isEqualToArray更复杂)你不太确定自己是否理解时,通常最好以直接的方式进行编码,而不是处理复杂的函数。一旦你的代码工作,你就可以回来"优化"使用复杂的API。

当您知道两个对象都是Arrays时,isEqualTo<Class>方法是比循环更快的检查相等性的方法。

isEqualTo<Class>用于提供相等性的特定检查。因此,isEqualToArray:检查数组是否包含相等数量的对象。

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

最新更新