即使我浏览了以下NSSet,NSMutableArray,NSFastEnumeration文档,但我找不到下面提到的方案的令人满意的来源:
此处,NSMutableArray
,NSArray
和NSSet
同样包含10000000个对象。
for (NSString *strIn in MutableArray) //NSMutableArray
{
// same Implementation
}
NSLog(@"Time for Mutable Array %d Iteration : %f",ObjectCount,[[NSDate date]timeIntervalSinceDate:startDate]);
startDate = [NSDate date];
for (NSString *strIn in array) //NSArray
{
// same Implementation
}
NSLog(@"Time for NSArray %d Iteration : %f",ObjectCount,[[NSDate date]timeIntervalSinceDate:startDate]);
startDate = [NSDate date];
for (NSString *strIn in Set) //NSSet
{
// same Implementation
}
NSLog(@"Time for Set %d Iteration : %f",ObjectCount,[[NSDate date]timeIntervalSinceDate:startDate]);
输出如下:
NSMutableArray
10000000迭代的时间:0.048785
NSArray
10000000迭代的时间:0.390537
NSSet
10000000迭代的时间:4.684203
为什么NSSet
和NSArray
迭代时间之间存在巨大差异。
请仔细阅读答案。
编辑: 我找到了上面迭代时间背后的实际原因,因为数组和Set中的计数不等。我已发布实际问题here。此外,我可以在这里发布相同的内容,但这个页面似乎太无证了,而且原因背后的原因也有所偏差。再次感谢大家的回应。
答案 0 :(得分:3)
我不同意你的结果:
#import <Foundation/Foundation.h>
#define COLLECTION_SIZE 10000000
static NSString *randomString() {
unichar buffer[18];
NSUInteger size = (arc4random() % 12) + 6;
for (NSUInteger i = 0; i < size; i++) {
buffer[i] = (arc4random() % 93) + '!';
}
return [[NSString alloc] initWithCharacters:buffer length:size];
}
static NSSet *createCollection(NSUInteger size) {
NSMutableSet *collection = [[NSMutableSet alloc] init];
for (NSUInteger i = 0; i < size; i++) {
for (;;) {
NSString *s = randomString();
if (![collection member:s]) {
[collection addObject:s];
break;
}
}
}
return collection;
}
static NSTimeInterval timedIter(id<NSFastEnumeration> collection) {
NSUInteger totalLength = 0;
NSDate *startDate = [NSDate date];
for (NSString *s in collection) {
totalLength += [s length];
}
return [[NSDate date] timeIntervalSinceDate:startDate];
}
int main(int argc, const char **argv) {
@autoreleasepool {
NSSet *set = createCollection(COLLECTION_SIZE);
NSArray *array = [set allObjects];
NSMutableArray *mutArray = [[set allObjects] mutableCopy];
NSLog(@"set iteration=%f", timedIter(set));
NSLog(@"array iteration=%f", timedIter(array));
NSLog(@"mutArray iteration=%f", timedIter(mutArray));
}
return 0;
}
$ clang -o itertime itertime.m -fobjc-arc -framework Foundation
$ ./itertime
2013-11-13 11:23:13.344 itertime[77576:707] set iteration=0.422592
2013-11-13 11:23:13.654 itertime[77576:707] array iteration=0.309387
2013-11-13 11:23:13.964 itertime[77576:707] mutArray iteration=0.309107
答案 1 :(得分:2)
区别在于大。可能就是这样,因为你已经发出了循环体。 我只是对10M NSNumbers做了同样的事情,差别要小得多:
Time for __NSArrayM: 0.334106
Time for __NSArrayI: 0.335368
Time for __NSSetI: 0.373651
你应该提供循环体,因为现在很难说你为什么会有这么大的差异。