Skip to content

Instantly share code, notes, and snippets.

@adachic
Created July 17, 2013 15:21
Show Gist options
  • Select an option

  • Save adachic/6021579 to your computer and use it in GitHub Desktop.

Select an option

Save adachic/6021579 to your computer and use it in GitHub Desktop.
NSMutableArrayとLinkedList速度比較 ref: http://qiita.com/adachi_c/items/f622d9b3835b90f6d3a5
//
// EXViewController.m
// Experiment
//
// Created by adachic on 2013/07/17.
// Copyright (c) 2013年 adachic. All rights reserved.
//
#import "EXViewController.h"
#include <sys/time.h>
const NSUInteger arraySize = 1000;
const NSUInteger tryCount = 100;
@interface Content : NSObject
@property (retain) Content *next;
@property (retain) NSString *dummyData;
@end
@implementation Content
- (id)init {
if (self = [super init]) {
/* 500characters */
self.dummyData = @""
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
return self;
}
@end
@interface EXViewController ()
@property (retain) NSMutableArray *mArray;
@property (retain) NSArray *array;
@property (retain) Content *head;
@end
@implementation EXViewController
static char **charsArray;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
charsArray = (char **) malloc(sizeof(char *) * arraySize);
memset(charsArray, 0x0, sizeof(charsArray));
self.mArray = [NSMutableArray array];
self.array = [NSArray array];
self.head = [[Content alloc] init];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
volatile void evaluatePattern1(NSMutableArray *mArray) {
struct timeval start[tryCount];
struct timeval end[tryCount];
time_t elapsed = 0;
time_t elapsed_min = INT32_MAX;
time_t elapsed_max = 0;
long long elapsed_sum_for_ave = 0;
double elapsed_ave = 0;
/**/
for (int try = 0; try < tryCount; try++) {
gettimeofday(&start[try], NULL);
for (int ii = 0; ii < arraySize; ii++) {
[mArray addObject:[[Content alloc] init]];
}
gettimeofday(&end[try], NULL);
elapsed = (end[try].tv_sec - start[try].tv_sec) * 1000000 + end[try].tv_usec - start[try].tv_usec;
if (elapsed_min > elapsed) {
elapsed_min = elapsed;
}
if (elapsed_max < elapsed) {
elapsed_max = elapsed;
}
elapsed_sum_for_ave += elapsed;
if (try != tryCount - 1) {
[mArray removeAllObjects];
}
}
elapsed_ave = elapsed_sum_for_ave / tryCount;
NSLog(@"MutableArray new elapsed:%ld", elapsed);
NSLog(@"MutableArray new elapsed average:%lf", elapsed_ave);
NSLog(@"MutableArray new elapsed min:%ld", elapsed_min);
NSLog(@"MutableArray new elapsed max:%ld", elapsed_max);
elapsed_min = INT32_MAX;
elapsed_max = 0;
elapsed_sum_for_ave = 0;
elapsed_ave = 0;
NSString *aho;
for (int try = 0; try < tryCount; try++) {
gettimeofday(&start[try], NULL);
for (int ii = 0; ii < arraySize; ii++) {
aho = [mArray objectAtIndex:ii];
}
gettimeofday(&end[try], NULL);
elapsed = (end[try].tv_sec - start[try].tv_sec) * 1000000 + end[try].tv_usec - start[try].tv_usec;
if (elapsed_min > elapsed) {
elapsed_min = elapsed;
}
if (elapsed_max < elapsed) {
elapsed_max = elapsed;
}
elapsed_sum_for_ave += elapsed;
}
elapsed_ave = elapsed_sum_for_ave / tryCount;
NSLog(@"MutableArray read elapsed:%ld", elapsed);
NSLog(@"MutableArray read elapsed average:%lf", elapsed_ave);
NSLog(@"MutableArray read elapsed min:%ld", elapsed_min);
NSLog(@"MutableArray read elapsed max:%ld", elapsed_max);
}
void evaluatePattern2(Content *head) {
struct timeval start[tryCount];
struct timeval end[tryCount];
time_t elapsed = 0;
time_t elapsed_min = INT32_MAX;
time_t elapsed_max = 0;
long long elapsed_sum_for_ave = 0;
double elapsed_ave = 0;
// head.next = [[Content alloc] init];
Content *cur;
/**/
for (int try = 0; try < tryCount; try++) {
head.next = [[Content alloc] init];
gettimeofday(&start[try], NULL);
for (int ii = 0; ii < arraySize; ii++) {
cur = head.next;
while (cur.next) {
cur = cur.next;
}
cur.next = [[Content alloc] init];
}
gettimeofday(&end[try], NULL);
elapsed = (end[try].tv_sec - start[try].tv_sec) * 1000000 + end[try].tv_usec - start[try].tv_usec;
if (elapsed_min > elapsed) {
elapsed_min = elapsed;
}
if (elapsed_max < elapsed) {
elapsed_max = elapsed;
}
elapsed_sum_for_ave += elapsed;
NSLog(@"%d",try);
}
elapsed_ave = elapsed_sum_for_ave / tryCount;
NSLog(@"linkedList new elapsed:%ld", elapsed);
NSLog(@"linkedList new elapsed average:%lf", elapsed_ave);
NSLog(@"linkedList new elapsed min:%ld", elapsed_min);
NSLog(@"linkedList new elapsed max:%ld", elapsed_max);
elapsed_min = INT32_MAX;
elapsed_max = 0;
elapsed_sum_for_ave = 0;
elapsed_ave = 0;
NSString *aho;
for (int try = 0; try < tryCount; try++) {
gettimeofday(&start[try], NULL);
cur = head.next;
while (cur.next) {
cur = cur.next;
aho = cur;
}
gettimeofday(&end[try], NULL);
elapsed = (end[try].tv_sec - start[try].tv_sec) * 1000000 + end[try].tv_usec - start[try].tv_usec;
if (elapsed_min > elapsed) {
elapsed_min = elapsed;
}
if (elapsed_max < elapsed) {
elapsed_max = elapsed;
}
elapsed_sum_for_ave += elapsed;
}
elapsed_ave = elapsed_sum_for_ave / tryCount;
NSLog(@"linkedList read elapsed:%ld", elapsed);
NSLog(@"linkedList read elapsed average:%lf", elapsed_ave);
NSLog(@"linkedList read elapsed min:%ld", elapsed_min);
NSLog(@"linkedList read elapsed max:%ld", elapsed_max);
}
- (IBAction)pushButton1:(id)sender {
evaluatePattern1(self.mArray);
}
- (IBAction)pushButton2:(id)sender {
evaluatePattern2(self.head);
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment