Skip to content

Instantly share code, notes, and snippets.

@ansonj
Last active May 2, 2016 16:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ansonj/4bf061217c6601f2a1b1464c69ebbb30 to your computer and use it in GitHub Desktop.
Save ansonj/4bf061217c6601f2a1b1464c69ebbb30 to your computer and use it in GitHub Desktop.
Testing performance of filling an NSMutableArray
//
// 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