enumerateObjectsUsingBlock 、for 、for(... in ...) 的區(qū)別 & 性能測(cè)試

for VS for(... in ...)

for 的應(yīng)用范圍廣基本可以NSArray、NSArray以及C語言的數(shù)組等,而for(... in ...)僅限于NSArray、NSArray等

for(... in ...) 更簡(jiǎn)潔、效率更高

測(cè)試代碼:

10^7 的數(shù)組,時(shí)間單位 秒,精確度 毫秒

NSMutableArray *test =[NSMutableArray array];for(inti=0; i <10000000; i++) {

[test addObject:@(i)];

}intsum =0;doubledate_s =CFAbsoluteTimeGetCurrent();for(inti =0;i < test.count; i++) {

sum+=1;

}doubledate_e =CFAbsoluteTimeGetCurrent();

NSLog(@"ForLoop Time: %f", date_e -date_s);

date_s=CFAbsoluteTimeGetCurrent();for(idobjintest) {

sum+=1;

}

date_e=CFAbsoluteTimeGetCurrent();

NSLog(@"Enumeration Time: %f", date_e - date_s);

測(cè)試結(jié)果:

考慮到實(shí)際情況,F(xiàn)orLoop 的操作較多些。

測(cè)試代碼:

硬件:i5 Cpu, 10G 內(nèi)存,Mac OS X 10.9.4

數(shù)據(jù)量:10^7 的數(shù)組,

時(shí)間:?jiǎn)挝?秒,精確度 毫秒

NSMutableArray *test =[NSMutableArray array];for(inti=0; i <10000000; i++) {

[test addObject:@(i)];

}intsum =0;doubledate_s =CFAbsoluteTimeGetCurrent();for(inti =0;i < test.count; i++) {intkey =[test[i] intValue];

sum+=key;

sum-=key;

}doubledate_e =CFAbsoluteTimeGetCurrent();

NSLog(@"ForLoop Time: %f", date_e -date_s);

date_s=CFAbsoluteTimeGetCurrent();for(idobjintest) {intkey =[obj intValue];

sum+=key;

sum-=key;

}

date_e=CFAbsoluteTimeGetCurrent();

NSLog(@"Enumeration Time: %f", date_e - date_s);

測(cè)試結(jié)果:

enumerateObjectsUsingBlock VS for(... in ...)

for(... in ...)用起來非常方便、簡(jiǎn)潔,同時(shí)enumerateObjectsUsingBlock:也有很多新特性:

通常enumerateObjectsUsingBlock:和 (for(... in ...)在效率上基本一致,有時(shí)會(huì)快些。主要是因?yàn)樗鼈兌际腔贜SFastEnumeration實(shí)現(xiàn)的. 快速迭代在處理的過程中需要多一次轉(zhuǎn)換,當(dāng)然也會(huì)消耗掉一些時(shí)間. 基于Block的迭代可以達(dá)到本機(jī)存儲(chǔ)一樣快的遍歷集合. 對(duì)于字典同樣適用,而數(shù)組的迭代卻不行。

注意"enumerateObjectsUsingBlock" 修改局部變量時(shí), 你需要聲明局部變量為__block 類型.

enumerateObjectsWithOptions:usingBlock:支持并發(fā)迭代或反向迭代,并發(fā)迭代時(shí)效率也非常高.

對(duì)于字典而言,enumerateObjectsWithOptions:usingBlock也是唯一的方式可以并發(fā)實(shí)現(xiàn)恢復(fù)Key-Value值.

就個(gè)人而言, 我偏向于使用enumerateObjectsUsingBlock:當(dāng)然最后還是要根據(jù)實(shí)際情況上下文決定用什么

測(cè)試代碼:

硬件:i5 Cpu, 10G 內(nèi)存,Mac OS X 10.9.4

數(shù)據(jù)量:10^4 的數(shù)組,執(zhí)行一次NSLog輸出

時(shí)間:?jiǎn)挝?秒,精確度 毫秒

NSMutableArray *test =[NSMutableArray array];for(inti=0; i <10000; i++) {

[test addObject:@(i)];

}doubledate_s =CFAbsoluteTimeGetCurrent();for(idobjintest) {

NSLog(@"%@",obj);

}doubledate_e =CFAbsoluteTimeGetCurrent();

NSLog(@"ForLoop Time: %f", date_e -date_s);

date_s=CFAbsoluteTimeGetCurrent();//[test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {//NSLog(@"%@",obj);//}];[test enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(idobj, NSUInteger idx, BOOL *stop) {

NSLog(@"%@",obj);;

}];

date_e=CFAbsoluteTimeGetCurrent();

NSLog(@"Enumeration Time: %f", date_e - date_s);

測(cè)試結(jié)果:

//ForLoop Time: 14.951485//Default Enumeration Time: 14.702673//Reverse Enumeration Time: 14.948526//Concurrent? Enumeration Time: 10.056317

參考:

http://stackoverflow.com/questions/4486622/when-to-use-enumerateobjectsusingblock-vs-for

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容