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

Grand Central Dispatch

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Grand Central Dispatch

Avatar for nghialv

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