Last active
May 2, 2016 16:25
-
-
Save ansonj/4bf061217c6601f2a1b1464c69ebbb30 to your computer and use it in GitHub Desktop.
Testing performance of filling an NSMutableArray
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// main.m | |
// ArrayInitialization | |
// | |
// Created by Anson Jablinski on 5/2/16. | |
// Copyright © 2016 ForeFlight. All rights reserved. | |
// | |
#import <Foundation/Foundation.h> | |
NSNumber *newNumber() { | |
return @(arc4random_uniform(1000)); | |
} | |
NSNumber *runExperiment(NSNumber*(^testBlock)(void), NSUInteger iterations) { | |
NSNumber *sum = @0; | |
for (int count = 0; count < iterations; ++count) { | |
sum = @(sum.doubleValue + testBlock().doubleValue); | |
} | |
return @(sum.doubleValue / @(iterations).doubleValue); | |
} | |
void printExperiment(NSString *name, NSString *description, NSUInteger iterations, NSNumber*(^testBlock)(void)) { | |
NSNumber *result = runExperiment(testBlock, iterations); | |
NSLog(@"\n%@ took %@ sec on average\n%@\n\n", name, result, description); | |
} | |
int main(int argc, const char * argv[]) { | |
@autoreleasepool { | |
NSUInteger experimentIterations = 10000; | |
printExperiment(@"addObject", @"[NSMutableArray array], then addObject:", experimentIterations, ^NSNumber *{ | |
NSMutableArray *array = [NSMutableArray array]; | |
double startTime = [NSDate timeIntervalSinceReferenceDate]; | |
for (int i = 0; i < 50; ++i) { | |
[array addObject:newNumber()]; | |
} | |
return @([NSDate timeIntervalSinceReferenceDate] - startTime); | |
}); | |
printExperiment(@"addObjectWithCapacity", @"[NSMutableArray arrayWithCapacity:], then addObject:", experimentIterations, ^NSNumber *{ | |
NSMutableArray *array = [NSMutableArray arrayWithCapacity:50]; | |
double startTime = [NSDate timeIntervalSinceReferenceDate]; | |
for (int i = 0; i < 50; ++i) { | |
[array addObject:newNumber()]; | |
} | |
return @([NSDate timeIntervalSinceReferenceDate] - startTime); | |
}); | |
printExperiment(@"assignment", @"[NSMutableArray arrayWithArray:] using literal @[] notation", experimentIterations, ^NSNumber *{ | |
NSMutableArray *array = nil; | |
double startTime = [NSDate timeIntervalSinceReferenceDate]; | |
array = [NSMutableArray arrayWithArray:@[ // 5 x 10 = 50 | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber() | |
]]; | |
return @([NSDate timeIntervalSinceReferenceDate] - startTime); | |
}); | |
printExperiment(@"immutable assignment", @"NSArray *array = @[...];", experimentIterations, ^NSNumber *{ | |
double startTime = [NSDate timeIntervalSinceReferenceDate]; | |
NSArray *array = @[ // 5 x 10 = 50 | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber(), | |
newNumber(), newNumber(), newNumber(), newNumber(), newNumber() | |
]; | |
return @([NSDate timeIntervalSinceReferenceDate] - startTime); | |
}); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment