OC循環(huán)for和for in的性能探討

在程序開發(fā)中最常用的應(yīng)該就是for循環(huán)對對象的遍歷如NSArray, NSSet 或者NSDictionary??此迫菀妆缓鲆暤狞c其實很影響app的性能開發(fā)。今天就對這個就自己的理解發(fā)表下自己的看法。

一.for循環(huán)的幾種方法

1.1 最常用的循環(huán)方式

NSArray *testArray = @[@1,@2,@3,@4];
for(int a = 0; a < testArray.count; a++){
    NSLog(@"%@",testArray[a]);
}

這段代碼最大的問題就是循環(huán)每進行一次我們都會調(diào)用數(shù)組的計數(shù)方法. 數(shù)組的總數(shù)是不會改變的,因此每次都去調(diào)用一下這種做法是多余的。常用的優(yōu)化如下:

NSArray *testArray = @[@1,@2,@3,@4];
NSUInteger count = testArray.count;
for(int a = 0; a < count; a++){
    NSLog(@"%@",testArray[a]);
}

1.2 快速枚舉
快速枚舉是在 Objective-C 2.0 中作為傳統(tǒng)的NSEnumerator的更便利的替代方法而引入的,新的方法順便帶來了一種新的循環(huán)語法, for…in 循環(huán)。

NSArray *testArray = @[@1,@2,@3,@4];
for(id num in testArray){
    NSLog(@"%@",num);
}

要注意的是使用for in快速枚舉NSMutableArray這類可變對象時要注意不能對容器進行修改,否則會導(dǎo)致遍歷器拋出異常導(dǎo)致程序崩潰。

二.性能測試

我們這里用命令行運行這段代碼以排除任何干擾最終結(jié)果的隱藏在幕后的保留或者排除處理。
clang -framework Foundation main.m -o main

static const NSUInteger arrayItems = 10000000;

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:arrayItems];
    for (int i = 0; i < arrayItems; i++) [array addObject:@(i)];
    array = [array copy];
    
    CFTimeInterval start = CFAbsoluteTimeGetCurrent();
    // 常用的for循環(huán)
    for (NSUInteger i = 0; i < [array count]; i++){
        id object = array[i];
        
    }
    CFTimeInterval forLoop = CFAbsoluteTimeGetCurrent();
    NSLog(@"For loop: %g", forLoop - start);
    
    //優(yōu)化過的常用for循環(huán)
    NSUInteger count = [array count];
    for (NSUInteger i = 0; i <  count; i++){
        id object = array[i];
        
    }
    CFTimeInterval forLoopWithCountVar = CFAbsoluteTimeGetCurrent();
    NSLog(@"Optimized for loop: %g", forLoopWithCountVar - forLoop);
    

    CFTimeInterval enumeratorLoop = CFAbsoluteTimeGetCurrent();
    // 快速枚舉
    for (id object in array){
        
    }
    CFTimeInterval forInLoop = CFAbsoluteTimeGetCurrent();
    NSLog(@"For…in loop: %g", forInLoop - enumeratorLoop);
    }

運行結(jié)果如下:

3DAE86E9-C7EC-4B4F-8C98-57BB9FE4B871.png

由此可以看出for in的性能最高,優(yōu)化了的普通循環(huán)也要比正常的快很多?;谖覀兯?,如果所有其它的因素都一樣的話,在循環(huán)遍歷數(shù)組時你應(yīng)該嘗試去使用for...in循環(huán)。至于 NSSet 和 NSDictionary,也可以測試一下,結(jié)果是一樣的。

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

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

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