Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Grand Central Dispatch

Grand Central Dispatch

nghialv

May 20, 2014
Tweet

More Decks by nghialv

Other Decks in Programming

Transcript

  1. • Pthreads : C-based interface for creating and manipulating threads

    • NSThread : Cocoa threads • Grand Central Dispatch : a lightweight multithreading engine developed by Apple Inc • NSOperation : wrapper for task
  2. What is GCD? • A lightweight multithreading engine • Uses

    a thread pool • Automatically optimizes threading • Scheduling of tasks • Uses look-free exclusion rather than mutual exclusion
  3. • define the tasks • block or function • add

    them to an appropriate dispatch queue dispatch_async(queue, ^{ some_async_work(); });
  4. thread thread thread Queue based task task task task task

    queue task task task task task queue task task task
  5. Queue types • Serial Queues • only one task running

    at a time • user queue or main queue • Concurrent Queue • tasks started in order but run concurrently • 3 priority levels: HIGHT, DEFAULT, LOW
  6. Frequently Used APIs • dispatch_async(queue, block) • dispatch_once(queue, block) •

    dispatch_apply(iterations, queue, block) • dispatch_group_async(group, queue, block)
  7. Palindromic words • palindromic words - ճจ • is a

    word that reads the same forward as it does backward : “radar” • problem • count the palindromic words in a dictionary radar wrong way yaw result = 3
  8. for (size_t index = 0; index < Words.count; index++) {

    NSString *word = [Words objectAtIndex:index]; NSString *reverseString = [self reverseString:word]; if([word caseInsensitiveCompare:reverseString] == NSOrderedSame) { self.palindromicCount++; } else { for (size_t i = index + 1; i < Words.count - 1; i++) { NSString *secondWord = [Words objectAtIndex:i]; if([reverseString caseInsensitiveCompare:secondWord] == NSOrderedSame) { self.palindromicCount += 2; break; } } } }; dispatch_apply(Words.count, queue, ^(size_t index) { NSString *word = [Words objectAtIndex:index]; NSString *reverseString = [self reverseString:word]; if([word caseInsensitiveCompare:reverseString] == NSOrderedSame) { self.palindromicCount++; } else { for (size_t i = index + 1; i < Words.count - 1; i++) { NSString *secondWord = [Words objectAtIndex:i]; if([reverseString caseInsensitiveCompare:secondWord] == NSOrderedSame) { self.palindromicCount += 2; break; } } } });
  9. for (size_t index = 0; index < Words.count; index++) {

    NSString *word = [Words objectAtIndex:index]; NSString *reverseString = [self reverseString:word]; if([word caseInsensitiveCompare:reverseString] == NSOrderedSame) { self.palindromicCount++; } else { for (size_t i = index + 1; i < Words.count - 1; i++) { NSString *secondWord = [Words objectAtIndex:i]; if([reverseString caseInsensitiveCompare:secondWord] == NSOrderedSame) { self.palindromicCount += 2; break; } } } }; dispatch_apply(Words.count, queue, ^(size_t index) { NSString *word = [Words objectAtIndex:index]; NSString *reverseString = [self reverseString:word]; if([word caseInsensitiveCompare:reverseString] == NSOrderedSame) { self.palindromicCount++; } else { for (size_t i = index + 1; i < Words.count - 1; i++) { NSString *secondWord = [Words objectAtIndex:i]; if([reverseString caseInsensitiveCompare:secondWord] == NSOrderedSame) { self.palindromicCount += 2; break; } } } });
  10. Results • iPhone 5 : dual-core A6 chip • dictionary

    : 25000 words 1.86 times faster Sequential GCD 274s 147s