Skip to content

Instantly share code, notes, and snippets.

@tLewisII
Created September 15, 2013 12:40
Show Gist options
  • Save tLewisII/6570455 to your computer and use it in GitHub Desktop.
Save tLewisII/6570455 to your computer and use it in GitHub Desktop.
A test of the execution time difference between Foundation and CoreFoundation for string tokenizing and counting.
///Using Foundation.
-(void)getWordsFromString:(NSString *)string withFrequency:(NSUInteger)frequency completion:(void(^)(NSArray *array))block {
NSDate *date = [NSDate date];
__block NSTimeInterval interval = 0.0;
NSMutableDictionary *temp = [NSMutableDictionary dictionaryWithCapacity:1000];
[string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if(!temp[substring]) {
temp[substring] = @1;
}
else {
NSNumber *counted = temp[substring];
counted = @(counted.integerValue + 1);
temp[substring] = counted;
}
if(enclosingRange.location + enclosingRange.length == string.length) {
NSArray *sortedArray = [[temp.allValues sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2] != NSOrderedDescending;
}]subarrayWithRange:NSMakeRange(0, (frequency > temp.count) ? temp.count : frequency)];
NSMutableArray *finalArray = [NSMutableArray arrayWithCapacity:frequency];
for(NSNumber *num in sortedArray) {
[finalArray addObjectsFromArray:[temp allKeysForObject:num]];
}
interval += [date timeIntervalSinceNow];
NSLog(@"%f",ABS(interval));
block(finalArray);
}
}];
}
///Using CoreFoundation
-(NSArray *)getWordsFromString:(NSString *)string withFrequency:(NSUInteger)frequency {
NSDate *date = [NSDate date];
__block NSTimeInterval interval = 0.0;
CFStringRef s = (__bridge CFStringRef)(string);
CFMutableDictionaryRef dictRef = CFDictionaryCreateMutable(kCFAllocatorDefault, 1000, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, s, CFRangeMake(0, CFStringGetLength(s)), kCFStringTokenizerUnitWord, CFLocaleCopyCurrent());
CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer))) {
CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
CFStringRef tokenValue = CFStringCreateWithSubstring(kCFAllocatorDefault, s, tokenRange);
if(CFDictionaryContainsKey(dictRef, tokenValue) == false) {
NSUInteger one = 1;
CFDictionaryAddValue(dictRef, tokenValue, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &one));
}
else {
CFNumberRef number = CFDictionaryGetValue(dictRef, tokenValue);
NSUInteger increment;
CFNumberGetValue(number, kCFNumberIntType, &increment);
increment += 1;
CFDictionarySetValue(dictRef, tokenValue, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &increment));
}
CFRelease(tokenValue);
}
CFRelease(tokenizer);
NSMutableDictionary *temp = (__bridge NSMutableDictionary *)(dictRef);
NSArray *sortedArray = [[temp.allValues sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2] != NSOrderedDescending;
}]subarrayWithRange:NSMakeRange(0, (frequency > temp.count) ? temp.count : frequency)];
NSMutableArray *finalArray = [NSMutableArray new];
for(NSNumber *num in sortedArray) {
[finalArray addObjectsFromArray:[temp allKeysForObject:num]];
}
interval += [date timeIntervalSinceNow];
NSLog(@"%f",ABS(interval));
return finalArray;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment