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