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

Grand Central Dispatch

Grand Central Dispatch

439d941a6e41920af9bf4d5bd5f97e3a?s=128

nghialv

May 20, 2014
Tweet

Transcript

  1. [iOS  multithreading:GCD];

  2. • Multithreading in iOS • Grand Central Dispatch • Queues

    • Example
  3. Multithreading in iOS

  4. • 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
  5. Pthreads NSThreads GCD NSOperation complexity low high abstraction level low

    high
  6. Grand Central Dispatch

  7. 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
  8. • define the tasks • block or function • add

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

    queue task task task task task queue task task task
  10. 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
  11. Frequently Used APIs • dispatch_async(queue, block) • dispatch_once(queue, block) •

    dispatch_apply(iterations, queue, block) • dispatch_group_async(group, queue, block)
  12. Example

  13. 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
  14. 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; } } } });
  15. 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; } } } });
  16. Results • iPhone 5 : dual-core A6 chip • dictionary

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