数组是编程常用的变量,数组内寻值也时日常操作。话说那种方法更快呢。
下面是白菜知道的几种方法:
生成一个随机数组,intSearch最多会随机出现一次
-(void)sort{
NSMutableArray *arrOrder=[NSMutableArray arrayWithCapacity:0];
NSInteger intTimes = 1;
NSInteger intEnd = 10000;
//生成一个随机数组,intSearch会随机出现一次
NSInteger intSearch = arc4random()%intEnd;
BOOL isHave = NO;
while (intTimes <= intEnd)
{
NSInteger intRandom = arc4random()%intEnd;
if (intRandom == intSearch) {
[arrOrder addObject:isHave? @(intSearch+1):@(intSearch)];
isHave = YES;
} else {
[arrOrder addObject:@(intRandom)];
}
intTimes++;
}
// NSLog(@"intSearch = %zd, arrOrder = %@", intSearch, arrOrder);
NSDate *dateCurrent = [NSDate date];
//方法1
if ([arrOrder indexOfObject:@(intSearch)] != NSNotFound) {
_times ++;
CGFloat sec = [[NSDate date] timeIntervalSinceDate:dateCurrent];
NSLog(@"第%zd次,sec1 = %f", _times, sec);
}
//方法2
dateCurrent = [NSDate date];
[arrOrder enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj integerValue] == intSearch) {
CGFloat sec = [[NSDate date] timeIntervalSinceDate:dateCurrent];
NSLog(@"第%zd次,sec2 = %f", _times, sec);
}
}];
//方法3
dateCurrent = [NSDate date];
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply([arrOrder count], queue, ^(size_t index) {
if ([arrOrder[index] integerValue] == intSearch) {
CGFloat sec = [[NSDate date] timeIntervalSinceDate:dateCurrent];
NSLog(@"第%zd次,sec3 = %f", _times, sec);
}
});
}
100条数据
2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec1 = 0.000015
2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec2 = 0.000010
2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec3 = 0.000025
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec1 = 0.000007
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec2 = 0.000008
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec3 = 0.000026
2017-08-28 13:54:45.766 examples[97490:5270031] 第3次,sec1 = 0.000004
2017-08-28 13:54:45.766 examples[97490:5270031] 第3次,sec2 = 0.000003
2017-08-28 13:54:45.767 examples[97490:5270031] 第3次,sec3 = 0.000018
1000条数据
2017-08-28 13:55:18.061 examples[97515:5271284] 第1次,sec1 = 0.000033
2017-08-28 13:55:18.062 examples[97515:5271284] 第1次,sec2 = 0.000052
2017-08-28 13:55:18.062 examples[97515:5271342] 第1次,sec3 = 0.000046
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec1 = 0.000004
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec2 = 0.000005
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec3 = 0.000021
2017-08-28 13:55:28.231 examples[97515:5271284] 第3次,sec1 = 0.000033
2017-08-28 13:55:28.232 examples[97515:5271284] 第3次,sec2 = 0.000032
2017-08-28 13:55:28.232 examples[97515:5271375] 第3次,sec3 = 0.000044
10000条数据
2017-08-28 14:00:00.034 examples[97585:5276437] 第1次,sec2 = 0.000489
2017-08-28 14:00:00.035 examples[97585:5276736] 第1次,sec3 = 0.000204
2017-08-28 14:00:11.082 examples[97585:5276437] 第2次,sec1 = 0.000304
2017-08-28 14:00:11.082 examples[97585:5276437] 第2次,sec2 = 0.000299
2017-08-28 14:00:11.083 examples[97585:5276789] 第2次,sec3 = 0.000178
2017-08-28 14:00:28.069 examples[97585:5276437] 第3次,sec1 = 0.000138
2017-08-28 14:00:28.069 examples[97585:5276437] 第3次,sec2 = 0.000201
2017-08-28 14:00:28.070 examples[97585:5276906] 第3次,sec3 = 0.000095
经过测试发现,数组数量越大,方法3相对比较效率更高。2000条是个大概的分界点,小于2000时前面的两个方法用时更短,大于2000时则方法3更快。