Created
July 17, 2013 15:21
-
-
Save adachic/6021579 to your computer and use it in GitHub Desktop.
NSMutableArrayとLinkedList速度比較 ref: http://qiita.com/adachi_c/items/f622d9b3835b90f6d3a5
This file contains hidden or 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
| // | |
| // 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