arrayByAddingObject
을 사용하고 변경 가능한 복사본을 만든 후 하나의 요소를 추가 할 때 어떤 성능 차이가 나는지 궁금합니다.
중요하지 않은 것으로 나타났습니다.
다음은 내가 다른 배열 크기를 테스트에서 볼 수 있듯이 내가
- (IBAction)doTest
{
for(int n = 0; n < 7; n++){
[self runTestWithExponent:n];
}
NSLog(@"done");
}
- (void)runTestWithExponent:(double)exponent
{
int arraySize = pow(10.0, exponent);
NSMutableArray *originalMutableArray = [NSMutableArray arrayWithCapacity:arraySize];
for(int i = 0; i < arraySize; i++){
[originalMutableArray addObject:@(i)];
}
NSArray *originalArray = [NSArray arrayWithArray:originalMutableArray];
originalMutableArray = nil;
//test first time
NSDate *now = [NSDate date];
NSArray *newArray = [originalArray arrayByAddingObject:@(-1)];
NSTimeInterval time1 = [[NSDate date] timeIntervalSinceDate:now];
newArray = nil;
//test second time
now = [NSDate date];
NSMutableArray *mutable = [originalArray mutableCopy];
[mutable addObject:@(-1)];
NSTimeInterval time2 = [[NSDate date] timeIntervalSinceDate:now];
mutable = nil;
NSString *winner = (time1 == time2) ? @"same" : ((time1 < time2) ? @"arrayByAdding" : @"mutable");
NSLog(@"%i : %f --- %f : %@ %f%%", arraySize, time1, time2, winner, (time1/time2 * 100));
}
을 사용하는 것입니다. 1, 10, 100 ... 1,000,000의 크기. 나는 크기에 관계없이 시간이 매우 비슷하다는 것을 알게되었습니다. 길이에 관계없이 때로는 한 가지 방법이 더 빠르며, 다른 하나는 더 빠릅니다. 나는 내부적으로 그들이 똑같은 일을한다고 생각합니다.
여기에 3 실점의 출력입니다 :
1 : 0.000026 --- 0.000034 : arrayByAdding 76.491228%
10 : 0.000011 --- 0.000011 : same 100.000000%
100 : 0.000021 --- 0.000024 : arrayByAdding 87.344913%
1000 : 0.000228 --- 0.000260 : arrayByAdding 87.689133%
10000 : 0.001458 --- 0.001406 : mutable 103.696638%
100000 : 0.015396 --- 0.015625 : arrayByAdding 98.534393%
1000000 : 0.158018 --- 0.162849 : arrayByAdding 97.033438%
done
1 : 0.000011 --- 0.000012 : arrayByAdding 92.039801%
10 : 0.000012 --- 0.000014 : arrayByAdding 85.531915%
100 : 0.000020 --- 0.000025 : arrayByAdding 79.952267%
1000 : 0.000185 --- 0.000144 : mutable 128.435430%
10000 : 0.001397 --- 0.001437 : arrayByAdding 97.216807%
100000 : 0.014448 --- 0.014132 : mutable 102.235803%
1000000 : 0.145622 --- 0.149862 : arrayByAdding 97.170746%
done
1 : 0.000013 --- 0.000012 : mutable 107.920792%
10 : 0.000011 --- 0.000013 : arrayByAdding 84.862385%
100 : 0.000025 --- 0.000029 : arrayByAdding 86.036961%
1000 : 0.000165 --- 0.000135 : mutable 122.207506%
10000 : 0.001547 --- 0.001470 : mutable 105.242884%
100000 : 0.014817 --- 0.014337 : mutable 103.347954%
1000000 : 0.146554 --- 0.148468 : arrayByAdding 98.710857%
done
이 단 하나 개의 요소를 추가하기위한 테스트되었습니다 있음을 유의하십시오. 아마도 1,000 개 크기의 배열에 500 개의 요소를 추가하는 것이 두 번째 방법을 사용하는 것이 더 빠를 것 같지만 다른 실험에 남겨 두었습니다.
출처
2014-10-22 21:13:31
Rob
** 매우 큰 배열이 있다고 가정 해 보겠습니다. OP가 요구하는 것을 수행하는 가장 효율적인 방법은 무엇입니까? 귀하의 솔루션, 또는 OP가 제안한 mutableCopy-> add-> cast 솔루션입니까? – Rob
가장 효율적입니다. 가변 배열. 그런 다음 내 메서드에 추가하여 배열. 나는 몰라. 테스트 해보고 결과를 알려주십시오 :-) – Fogmeister
나는 이것을 테스트했는데 크기에 관계없이 요소를 하나만 추가하는 한 동일한 것으로 판명되었습니다. 여기에 긴 설명이 있습니다 : http://stackoverflow.com/a/26517217/1564332 – Rob